python - 为什么我的可选组不是贪心的?/(5)?.*/

标签 python regex

我认为即使一个组是可选的 ?,它仍然会贪婪并消耗字符,如果可以的话,然后再进入下一部分正则表达式。

当我指定简化的正则表达式 (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/

相关文章:

python - 从 Python 设置 qml 属性?

Python解析模块执行Query.filter或Query.get时出错

python - 如何计算 'for' 循环中的内容?

ios - Swift 中的正则表达式?

Python:UserWarning:此模式具有匹配组。要实际获取组,请使用 str.extract

python - TypeError:在字符串格式化python期间并非所有参数都转换了

python - 无法导入子模块中的包

javascript - 仅当包含在正则表达式匹配中时才替换正则表达式?

php - 正则表达式获取 $_GET 变量

Java 中姓氏、名字的正则表达式