【问题标题】:Non-greedy in Python RegexPython 正则表达式中的非贪婪
【发布时间】:2015-07-11 13:02:39
【问题描述】:

我试图理解python中的非贪婪正则表达式,但我不明白为什么下面的例子有这个结果:

print(re.search('a??b','aaab').group())
ab
print(re.search('a*?b','aaab').group())
aaab

我认为第一个是“b”,第二个是“ab”。 谁能解释一下?

【问题讨论】:

  • 原因是正则表达式引擎从左到右解析字符串,并在最左边的位置返回第一个可能的匹配项。您使用非贪婪量词这一事实不会改变任何事情。

标签: python regex non-greedy


【解决方案1】:

发生这种情况是因为您要求的匹配之后匹配。如果您尝试跟踪 a??b 的匹配是如何从左到右发生的,您会看到如下内容:

  • 尝试 0 a 加上 baaab:不匹配 (b != a)
  • 尝试 1 a 加上 baaab :不匹配 (ab != aa)
  • 尝试 0 abaab:不匹配 (b != a)(匹配位置向右移动一位)
  • 尝试 1 a plus b vs aab:不匹配 (ab != aa)
  • 尝试 0 a 加上 bab:不匹配 (b != a)(匹配位置向右移动一位)
  • 尝试 1 a 加上 bab匹配 (ab == ab)

*? 也是如此。

事实上,search 函数返回 leftmost 匹配。使用??*? 只会将行为更改为首选最左边匹配,但它会返回从已找到匹配右侧开始的较短匹配.

另请注意,re 模块不会返回重叠匹配项,因此即使使用 findallfinditer 您也无法找到您要查找的两个匹配项。

【讨论】:

    【解决方案2】:

    因为??lazy? 是贪婪的。并且惰性量词将匹配零或一(它的左标记),如果仍然允许整体模式匹配则为零。例如所有以下将返回一个空字符串:

    >>> print(re.search('a??','a').group())
    
    >>> print(re.search('a??','aa').group())
    
    >>> print(re.search('a??','aaaa').group())
    

    而正则表达式 a??b 将匹配 abb

    >>> print(re.search('a??b','aaab').group())
    ab
    >>> print(re.search('a??b','aacb').group())
    b
    

    如果它不允许整体模式匹配并且没有任何b,它将返回 None :

    >>> print(re.search('a??b','aac').group())
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'NoneType' object has no attribute 'group'
    

    关于第二部分,你有一个非贪婪的正则表达式,结果非常明显。它将匹配任意数量的a,然后是b

    print(re.search('a*?b','aaab').group())
    aaab
    

    【讨论】:

      【解决方案3】:

      模式说明 - /a??b/

      a?? 按字面意思匹配字符 a(区分大小写),然后是量词 ?? 表示在零和一次之间,尽可能少,根据需要扩展 [lazy],然后字符 b 应该匹配,字面意思(区分大小写)

      所以它将匹配给定字符串'aaab'中的最后一个'ab'字符

      对于模式 - /a*?b/

      a*? 匹配字符 'a' 字面意思(区分大小写) 这里的量词 *? 表示在零和无限次之间,尽可能少,根据需要扩展 [lazy] 然后字符 b 应该匹配,字面意思(区分大小写)。

      所以它将在'aaab'中作为一个整体匹配'aaab'

      【讨论】:

        猜你喜欢
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 2021-05-22
        • 1970-01-01
        相关资源
        最近更新 更多