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(最右边)一)?
匹配按照“最左边,然后是最长”的方式“排序” ;然而,“最长”是在允许非贪婪之前使用的术语,而是意味着“每个原子的首选重复次数”。最左边比重复次数更重要。因此,“a+?$”不会匹配“baaaaa”中的最后一个 A,因为第一个 A 的匹配在字符串中较早开始。
(在评论中对OP进行澄清后,答案发生了变化。请参阅历史记录以了解以前的文本。)