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)?
)也没有被匹配。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)?
)也没有被匹配。当正则表达式引擎尝试在字符串abc defg
上匹配.*(def)
时,会发生以下情况:
.*
最初尝试尽可能多地匹配,从而匹配整个字符串。(def)
的方法,即当.*
仅匹配abc
时发生。然而,如果我们将正则表达式更改为.*(def)?
,则会发生以下情况:
.*
,从而匹配整个字符串。(def)?
是贪婪的,引擎虽然希望能够匹配它,但它不会回溯之前的子模式,只是让.*
吞噬整个字符串,没有留下任何内容给(def)?
。对于.*?(def)
和.*?(def)?
也发生类似的情况:
.*?
尝试最少地匹配,即根本不匹配。(def)
无法匹配,但(def)?
可以。 因此,对于(def)
,正则表达式引擎必须返回并考虑更长的.*?
匹配,直到找到一个能够使全模式匹配的匹配项,而对于(def)?
,它不必这样做,因此它不会这样做。有关更多信息,请参见Perl正则表达式手册中的“组合RE片段”部分(与Python的“ Perl兼容”正则表达式的行为相匹配)。