我正在使用python3 re模块-我发现a*a
与aaa
相匹配。我以为regex默认情况下是贪婪的(除非我们将其覆盖以?
懒惰)-因此,a*
会匹配整个字符串,并且模式中的尾随a
会匹配失败。但是,它匹配:
$ import re
$ re.match(r'a*a', 'aaa')
<_sre.SRE_Match object; span=(0, 3), match='aaa'>
这应该不会失败吗?
答案 0 :(得分:2)
确实最初尝试匹配整个字符串,但是如果匹配失败,则重复 backtrack 。在x
最初匹配整个字符串之后,正则表达式尝试匹配下一个令牌,即单个a*
失败,因此a
backtracks 返回一个字符(因此仅匹配a*
而不匹配aa
)。这次,满足了最后一个令牌,即单个aaa
, ,因此找到了一个匹配项。
贪婪并不意味着只有允许重复的标记与字符串的其余部分匹配时,正则表达式才会匹配。如果可以,它将 ,但是如果不能,它将回溯。
即使具有a
的贪婪重复回溯到零长度,也没有问题,因为*
意味着匹配零次或更多次。 (相比之下,以*
重复,如果它回溯到零长度,则正则表达式将完全失败,因为+
意味着至少需要重复一次)< / p>
答案 1 :(得分:0)
a*
表示零个或多个“ a”字符。 a*a
的意思是“零个或多个“ a”字符后跟一个“ a”。“ aaa”的确是“零个或多个a字符后跟一个“ a”,因为“ aa”符合“零个或多个”条件”。