python - 为什么最小(非贪婪)匹配会受到字符串结尾字符 '$' 的影响?

标签 python regex non-greedy

编辑:删除原始示例,因为它引发了辅助答案。还固定了标题。

问题是为什么正则表达式中“$”的存在会影响表达式的贪婪度:

这是一个更简单的例子:

>>> import re
>>> str = "baaaaaaaa"
>>> m = re.search(r"a+$", str)
>>> m.group()
'aaaaaaaa'
>>> m = re.search(r"a+?$", str)
>>> m.group()
'aaaaaaaa'

“?”似乎什么都不做。请注意,当“$”被删除时,然后是“?”受到尊重:

>>> m = re.search(r"a+?", str)
>>> m.group()
'a'

编辑: 换句话说,“a+?$”匹配所有 a 而不是最后一个,这不是我所期望的。这是正则表达式“+?”的描述来自 python docs : “添加'?'在限定符使其以非贪婪或最小方式执行匹配之后;将匹配尽可能少的字符。”

在这个例子中似乎不是这种情况:字符串“a”匹配正则表达式“a+?$”,那么为什么字符串“baaaaaaa”上的相同正则表达式的匹配不只是单个 a (最右边的那个)?

最佳答案

匹配由 "left-most, then longest" “排序” ;然而,“最长”是在允许非贪婪之前使用的术语,而是表示类似于“每个原子的首选重复次数”。最左边比重复次数更重要。因此,“a+?$”将不会匹配“baaaaa”中的最后一个 A,因为第一个 A 的匹配在字符串中较早开始。

(在评论中的 OP 澄清后答案发生了变化。查看以前文本的历史记录。)

关于python - 为什么最小(非贪婪)匹配会受到字符串结尾字符 '$' 的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5876989/

相关文章:

python - 导入错误? ( python 3.2)

python - Flask-SQLAlchemy 数据类型

python - 在数据框中使用 isin 和 NaN

Javascript 使用正则表达式分割数字和字符串

regex - 'lazy' 和 'greedy' 在正则表达式中意味着什么?

regex - 在向后方向制作一个非贪婪的 RegEx,使其行为与向前方向相同

Python re.findall 非贪婪结果

python - 有没有办法读取所有行,直到使用 Python Pandas 遇到空行

c# - 解析 RegEx 模式

c# - 提取韩文和数字字符