regex - 为什么 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'>
这不应该失败吗?
解决方案
它最初会尝试匹配整个字符串,但如果匹配失败,重复将回溯。在a*
最初匹配整个字符串之后,正则表达式尝试匹配下一个标记,即单个a
This 失败,因此a*
回溯回一个字符(因此它只匹配aa
而不是aaa
)。这一次,最后一个标记 single得到a
满足,因此找到了一个匹配项。
贪婪并不意味着正则表达式只有在允许重复的标记匹配整个字符串的其余部分时才会匹配。如果可以,它会,但如果它不能,它会回溯。
即使贪婪重复*
回溯到零长度,也没有问题,因为*
意味着匹配零次或多次。(相比之下,用 重复+
,如果它回溯到零长度,正则表达式将完全失败,因为+
意味着至少需要重复一次)
推荐阅读
- python - 在 Python 中计算矩阵乘以其转置 (AA^T) 的最快方法
- excel - 虽然 Excel 表受密码保护,但我仍然可以从右键菜单中删除
- python - FacetGrid 上的 Seaborn 颜色条用于具有标准化颜色映射的 histplot
- time-series - What to report in a time serie database when the measure failed?
- panel - 在 CANoe 的 CAPL 中使用 Hex/Texteditor 使用系统变量?
- google-app-engine - 使用 IAP 在 App Engine 上提供服务到服务请求
- java - 字符串不会保存从方法内部给它的值
- vector - 电场向量图
- r - 使用ugarchfit时如何处理R中的缺失值错误?
- c# - c# FileSystemWatcher如何处理多个文件?