我认为即使一个组是可选的 ?
,它仍然会贪婪并消耗字符,如果可以的话,然后再进入下一部分正则表达式。
当我指定简化的正则表达式 (5)?.*
与 (5).*
(组 1 不是 可选)时,我在 python 2.7.6 中看到不同的行为,即使我期望使用完全相同的字符串的相同行为:
>>> import re
>>> s = 'before [5.5s] after'
>>> r = re.compile(r'(5)?.*')
>>> print r.search(s).groups()
(None,)
>>> r2 = re.compile(r'(5).*')
>>> print r2.search(s).groups()
('5',)
我没有得到什么?为什么第一个正则表达式 r
没有吸收 5?
注意:我需要为什么的理论,因为任何试图解决这个特定正则表达式的尝试都对我没有帮助。这是 SSCCE .我有一个更复杂的正则表达式,我真的很想填补我的知识空白,为什么可选组不像我想象的那样贪婪。
最佳答案
第一个例子:
- 您的正则表达式与整个 字符串
s
相匹配。 - 因此,
s
的第一个字符,即 "b",与(5)?
匹配,后者不结果不匹配。然而,这不是问题,因为(5)?
是模式的可选部分,因此正则表达式引擎将它匹配零次并继续推进当前位置模式。 - 字符串的其余部分与模式的其余部分相匹配,因此整个字符串是一个匹配项。但是,组
(5)
本身没有匹配任何内容,因此您在第一个示例中看到的是None
。
第二个例子:
5
不再是可选的,因此可能匹配的字符串的第一个字符必须是 "5"。因此,潜在匹配从 “之前 [” 之后的 “5” 开始。- 为了匹配,剩余的字符串必须与剩余的模式
.*
匹配,它确实如此。
请注意,一般情况下,using the greedy .*
is almost never what you want .
关于python - 为什么我的可选组不是贪心的?/(5)?.*/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36850294/