首页 > 解决方案 > 为什么 a*a 匹配 aaa?

问题描述

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

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

这不应该失败吗?

标签: regexpython-3.xregex-greedy

解决方案


它最初尝试匹配整个字符串,但如果匹配失败,重复将回溯。a*最初匹配整个字符串之后,正则表达式尝试匹配下一个标记,即单个aThis 失败,因此a* 回溯回一个字符(因此它只匹配aa而不是aaa)。这一次,最后一个标记 single得到a满足,因此找到了一个匹配项。

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

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


推荐阅读