import re str='abc defg' m1 = re.match(".*(def)?",str) m2 = re.match(".*(def)",str) print (m1.group(1),m2.group(1))
以上输出为:
(None,‘def’)
到底是怎么回事?即使使用非贪心的重复操作符,可选的捕获组(def)?不匹配
解决方法
当正则表达式引擎尝试匹配时,会发生什么.*(def)对abc defg:
>首先,引擎开始尝试匹配字符串开头的正则表达式.
>贪心的子模式*最初尝试匹配多次,匹配整个字符串.
>因为这导致其余的匹配失败,所以正则表达式引擎回溯直到找到一种方法来匹配(def),当.*只匹配abc时发生.
但是,如果我们将正则表达式更改为.*(def)?,则会发生以下情况:
>首先,正则表达式引擎再次从字符串的开头开始.
>接下来,它再次尝试匹配.*尽可能多的次数,匹配整个字符串.
>但是在这一点上,由于正则表达式的其余部分都是可选的,所以找到了整个正则表达式的匹配!自(def)?是贪婪的,引擎会喜欢匹配它,如果它可以,但它不会回溯早期的子模式,只是为了看看是否可以.相反,它只是让.*摆脱整个字符串,没有什么(def)?
类似的事情发生在.*?(def)和.*?(def)?:
>再次,引擎从字符串的开头开始.
>不客气的子模式*尝试尽可能少地匹配,即不完全匹配.
>那时,(def)不能匹配,但是(def)?能够.因此,对于(def),正则表达式引擎必须返回并考虑更长的匹配.*?直到找到一个允许完整模式匹配的,而对于(def)?它不必这样做,所以没有.
有关更多信息,请参阅“Combining RE Pieces” section of the Perl regular expressions manual(与Python的“Perl兼容”正则表达式的行为相匹配).