import re
str='abc defg'
m1 = re.match(".*(def)?",str)
m2 = re.match(".*(def)",str)
print (m1.group(1),m2.group(1))
上面的输出是:
(无,'def')
到底是怎么回事?即使使用非贪婪重复运算符,可选的捕获组(def)?
也不匹配。
以下是当正则表达式引擎尝试匹配时发生的.*(def)
情况abc defg
:
.*
最初尝试尽可能多地匹配,匹配整个字符串。(def)
时发生。.*
abc
但是,如果我们将正则表达式更改为 ,则会.*(def)?
发生以下情况:
.*
尽可能多地匹配,匹配整个字符串。(def)?
是贪心的,如果可以的话,引擎会更愿意匹配它,但它不会回溯早期的子模式只是为了看看它是否可以。相反,它只是让.*
吞噬整个字符串,没有留下任何(def)?
.类似的事情发生在.*?(def)
and上.*?(def)?
:
.*?
尝试尽可能少地匹配,即根本不匹配。(def)
不能匹配,但(def)?
可以。因此,对于(def)
正则表达式引擎必须返回并考虑更长的匹配,.*?
直到它找到一个允许完整模式匹配的匹配,而对于(def)?
它不必这样做,所以它没有。有关更多信息,请参阅Perl 正则表达式手册的“组合 RE 片段”部分(它与 Python 的“Perl 兼容”正则表达式的行为相匹配)。