在上一节中,介绍了元字符的概念。在这一节中,介绍重复匹配的概念,通过将元字符与重复匹配的语法结合,可以实现对多个字符、段落等的匹配。

匹配一个或多个字符

+ 作为一个字符、或者字符集合的后缀,来匹配一个或多个连续出现的字符。
例如
[0-9]+ 表示匹配1个数字,或者多个数字。
a+ 表示匹配1个字母,或者多个字母。

python正则表达式重复多次 正则表达式重复匹配_正则表达式

根据上图结果显示,cat.+ 匹配到了以cat开头的字符串。

匹配零个或多个字符

* 作为一个字符、或者字符集合的后缀,来匹配零个或多个连续出现的字符。
例如
[0-9]* 表示匹配0个数字,或者多个数字。
a* 表示匹配0个字母,或者多个字母

python正则表达式重复多次 正则表达式重复匹配_元字符_02

cat_*[\d]+@qq.com 表示匹配cat开头,包含零个或者1个下划线_,包含至少一个数字的qq邮箱。

根据上图显示,该正则表达式匹配到了预想的结果。

匹配零个或一个字符

? 作为一个字符、或者字符集合的后缀,表示只能匹配零次或者一次。

上一个案例中,针对含有下划线的邮箱,可以采用下面的正则表达式。
cat_?[\d]+@qq.com

python正则表达式重复多次 正则表达式重复匹配_python正则表达式重复多次_03

根据上图显示,该正则表达式同样匹配到了预想的结果。

设定准确重复匹配次数

由于 +* 匹配的个数没有上限,而使用 ? 最少也只能匹配0个或者1的个数。为解决对匹配次数的准确控制,正则表达式提供了重复次数的操作。

{}包含数字的语法结构,来匹配设定数字的重复匹配次数。

python正则表达式重复多次 正则表达式重复匹配_字符串_04

正则表达式cat[\d]{2}表示匹配cat开头,后面只有两个数字的字符串。

由上图显示,该正则表达式匹配到了全文中,唯一的cat12字符串。

设定区间重复匹配次数

{a , b}包含数字a与数字b的语法结构,表示重复匹配次数最小值a与最大值b,表示最少匹配a次,最多匹配b次。

python正则表达式重复多次 正则表达式重复匹配_元字符_05

正则表达式cat[\d]{2,3}表示匹配cat开头,后面只有两个数字或者三个数字的字符串。
根据上图显示,该正则表达式匹配到了全文中的cat12、cat123字符串。

设定只有最小值的重复匹配次数

{a , }包含数字a的语法结构,表示重复匹配次数最小值a,表示最少匹配a次。

python正则表达式重复多次 正则表达式重复匹配_python正则表达式重复多次_06

正则表达式cat[\d]{2,}表示匹配cat开头,后面至少有两个数字的字符串。
根据上图显示,该正则表达式匹配到了全文中的cat12、cat1234字符串。

防止过度匹配

在使用.字符以及*等贪婪型元字符时来匹配时,会发生匹配过渡的情况。

python正则表达式重复多次 正则表达式重复匹配_元字符_07

正则表达式<cat>.*</cat>在匹配时,将两个<cat>.*</cat>之间的ads也匹配成在了一起。即发生了过度匹配的情况。

在这种情况下,应该使用对应的懒惰型元字符来抵消其贪婪行。
贪婪型元字符 * 的懒惰型元字符 *? 贪婪型元字符 + 的懒惰型元字符 +? 贪婪型元字符 {n, } 的懒惰型元字符 {n, }?

对上面的正则表达式进行修改,改为<cat>.*?</cat>

python正则表达式重复多次 正则表达式重复匹配_元字符_08

根据上图可以看出,这次的正则表达式准确的匹配到了设想的结果。

「参考」
《正则表达式必知必会》