为什么a * a匹配aaa?

时间:2018-09-09 03:35:30

标签: regex python-3.x regex-greedy

我正在使用python3 re模块-我发现a*aaaa相匹配。我以为regex默认情况下是贪婪的(除非我们将其覆盖以?懒惰)-因此,a*会匹配整个字符串,并且模式中的尾随a会匹配失败。但是,它匹配:

$ import re
$ re.match(r'a*a', 'aaa')
<_sre.SRE_Match object; span=(0, 3), match='aaa'>

这应该不会失败吗?

2 个答案:

答案 0 :(得分:2)

确实最初尝试匹配整个字符串,但是如果匹配失败,则重复 backtrack 。在x最初匹配整个字符串之后,正则表达式尝试匹配下一个令牌,即单个a*失败,因此a backtracks 返回一个字符(因此仅匹配a*而不匹配aa)。这次,满足了最后一个令牌,即单个aaa ,因此找到了一个匹配项。

贪婪并不意味着只有允许重复的标记与字符串的其余部分匹配时,正则表达式才会匹配。如果可以,它将 ,但是如果不能,它将回溯。

即使具有a的贪婪重复回溯到零长度,也没有问题,因为*意味着匹配零次或更多次。 (相比之下,以*重复,如果它回溯到零长度,则正则表达式将完全失败,因为+意味着至少需要重复一次)< / p>

答案 1 :(得分:0)

a*表示零个或多个“ a”字符。 a*a的意思是“零个或多个“ a”字符后跟一个“ a”。“ aaa”的确是“零个或多个a字符后跟一个“ a”,因为“ aa”符合“零个或多个”条件”。