正则中的坑。。。

最近学习到了正则部分,刚开始接触的时候,有些东西不好理解,加之正则的知识点很零散,很多方法加上量词,就能组合出很多的情况。下面的坑是我遇到的如果有同样疑问的同学可以参考一下。

A

>>> re.match(r"a{1,3}","aaabbaa").group()
'aaa'

B

>>> re.match(r"a{1,3}?","aaabbaa").group()
'a'


C

>>> re.match(r"a{1,3}?b{2}","aaabbaa").group()
'aaabb'

D

>>> re.match(r"a{1,3}?b{,2}","aaabbaa").group()
'a'

疑问1:

为什么在B栗子中量词?抑制了正则的贪婪,但是C中并没有。

疑问2:

栗子D中将b的匹配次数做了最大限制,为什么量词?又成功抑制了正则的贪婪。

为了搞清楚,先说下背景知识。

量词?表示匹配0次或者1次,当匹配到0次时返回空字符串‘’

{m,n}表示匹配m-n次。

{m,}表示最小匹配m次,最大匹配不设上限。

{,n}表示最小匹配0次,注意是包含0次的,最大匹配n次。

空字符串加上一个字符串返回字符串本身

>>> ''+"a"
'a'

栗子B中要匹配a 1次到3次,但是被量词?抑制了所以按最小的匹配返回一个“a”

栗子C中由于表达式r"a{1,3}?b{2}"除了匹配a还要匹配b2次,此时为了表达式成立?没有作用,而是找到了结果'aaabb',
如果后面的字符串中不符合表达式的要求则返回None.如下

>>> re.match(r"a{1,3}?b{2}","aaabaa").group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

栗子D中,由于b{,2}的匹配范围是0-2次,所以此时的情况相当于B只返回了“a”
像这种坑在正则中还有很多,没办法,只能多实践,见多识广,练就百毒不侵的功夫。

原文地址:https://www.cnblogs.com/King-Tong/p/12103872.html