正则中的坑。。。
最近学习到了正则部分,刚开始接触的时候,有些东西不好理解,加之正则的知识点很零散,很多方法加上量词,就能组合出很多的情况。下面的坑是我遇到的如果有同样疑问的同学可以参考一下。
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”
像这种坑在正则中还有很多,没办法,只能多实践,见多识广,练就百毒不侵的功夫。