为什么最小(非贪婪)匹配受字符串字符"$"结尾的影响?

kru*_*kin 7 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'
Run Code Online (Sandbox Code Playgroud)

"?" 似乎什么都不做.注意当"$"被删除时,然后"?" 受到尊重:

>>> m = re.search(r"a+?", str)
>>> m.group()
'a'
Run Code Online (Sandbox Code Playgroud)

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

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

Fre*_*urk 4

匹配按照“最左边,然后是最长”的方式“排序” ;然而,“最长”是在允许非贪婪之前使用的术语,而是意味着“每个原子的首选重复次数”。最左边比重复次数更重要。因此,“a+?$”不会匹配“baaaaa”中的最后一个 A,因为第一个 A 的匹配在字符串中较早开始。

(在评论中对OP进行澄清后,答案发生了变化。请参阅历史记录以了解以前的文本。)