正则表达式之重复

python正则表达式中, *表示重复0次或更多次, +表示重复1次或更多次, ?表示重复0次或1次, {n}表示重复n次, {n,}表示重复重复n次或更多次, {n,m}表示重复重复n到m次

为了让正则表达式更加灵活,省去表达式中重复的部分,正则表达式提供了可以设置重复的量词

代码/语法 说明
* 重复0次或更多次
+ 重复1次或更多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

接下来逐个讲解他们的用法

1. * 表示重复0次或更多次

假设目标字符串是

book  block  bottom like  love   over  too

一些单词,现在想要从这些单词中提取出包含字母o的单词,观察一下这些单词,有以o开头的,有以o结尾的,还有o在单词中间的,正则表达式则可以协程

\b\w*o\w*\b
  • \b 匹配单词的开始和结束
  • 第一个\w* \w表示字母或数字,* 表示重复0次或多次,如果重复0次,那么就匹配以o开头的单词,如果重复多次,就匹配o在中间或者结尾的单词
  • 第二个\w* \w表示字母或数字,* 表示重复0次或多次,如果重复0次,就匹配以o结尾的单词,如果重复多次就匹配o在中间或者以o开头的单词

2. + 表示重复1次或更多次

假设目标字符串是

今天吃饭花了300块钱,打车花了20块钱,清空淘宝购物车花了1500块钱

现在想要使用正则表达式提取出花费金额,则可以这样写正则表达式

\d+

\d 表示数字,+ 表示重复1次或多次, 匹配的结果为 300 20 1500

3. ? 重复0次或1次

?表示重复0次或1次,假设目标字符串为

我有两个电话号 15801121234  和 +8615801122345

+86 是大陆区号,涉及到电话的处理时经常会遇到它,现在要写一个能够匹配这两个电话的正则表达式

(\+86)?\d{11}

使用这个表达式,两个电话都可以匹配上,这是至今为止,你在本教程中遇到的最复杂的正则表达式,学会这一个正则,你讲掌握一下几个知识点

  1. 转义字符
  2. 分组
  3. 重复指定次数

3.1 转义字符

+ 表示重复1次或更多次,如果想要匹配的字符里本身就有+ 该怎么办呢?比如目标字符串是

1 + 1 = 3

现在写一个正则表达式匹配等号左侧的部分,则应该这样写

\d\s\+\s\d

+ 就表示 加号本身,不再具有重复的作用

3.2 分组

前面在讲重复时,都是重复某个字符,如果想要让一个字符串重复呢,就如本题中的+86,它作为一个整体重复0次或1次,就需要用小括号把+86括起来,(+86) 就变成了一个分组,也叫子表达式,在使用正则表达式匹配时,这些分组的部分如果被匹配上,可以获得字符串中匹配的字符串。

3.3 重复指定次数

. 表示重复任意次数

  • 表示重复1次或多次
    ? 表示重复0次或1次

如果想要重复指定的次数,则使用{n}这种形式,表示重复n次

有了前面这3个知识点的铺垫,理解这个正则就简单了

(\+86)?\d{11}
  • (+86)? 表示+86重复0次或1次
  • \d{11} 表示数字重复11次

4. 重复指定次数

{n} 表示重复n次
{n,} 表示n次或更多次,换一个说法就是至少重复n次
{n, m} 表示重复n到m次,换一个说法就是至少重复n次,最多重复m次

5. 如何记住这些表示重复的量词的含义

你不能每一次写正则的时候都打开本网页查看这些量词所代表的含义,但这些量词的含义和作用又确实难以记忆,经常容易搞混,我讲述一下,我是如何记忆这些量词的含义的。

首先,将这些量词分为两部分,一部分是有{}的,一部分是没有{}的,先来看有{}的,可以归结为3类

  1. 规定重复次数的 {n}
  2. 规定重复次数下限的 {n, }
  3. 规定重复次数下限和上限的 {n, m}

再来看* + ?

  1. * 表示0次或多次,这个你只能是死记硬背
  2. + 是在* 的基础上加1,就变成了1次或多次
  3. ? 表示你也很懵逼,所以向老师提问,到底是重复0次还是1次呢?

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案