【问题标题】:Python regex strange behavior [duplicate]Python正则表达式奇怪的行为[重复]
【发布时间】:2023-03-31 17:25:01
【问题描述】:

我发现了一些我无法在 Python re 模块中解释的东西。 编译(a*)*(a*|b)* 会抛出错误:

raise error, v # 无效表达式 sre_constants.error:无需重复

我已经在 javascript 中测试了这个正则表达式,它似乎没问题。

这是一个错误吗?

【问题讨论】:

  • 我要补充一点:从逻辑上讲,这些都没有意义。 (a*)*a* 相同,(a*|b)*[ab]*(或(a|b)*)相同。出于好奇,有没有好的用例?
  • @Kobi 也许是一个贪婪的匹配,即你匹配尽可能长的字符串但更少的实例 - 但为此你需要+ 而不是*

标签: python regex


【解决方案1】:

是的,这是一个错误(或至少是一个错误功能)。它抱怨如果a* 什么都不匹配,它不知道如何捕获 0 个或多个“无”。

【讨论】:

    【解决方案2】:

    Python 中的一个错误。

    http://bugs.python.org/issue2537

    http://bugs.python.org/issue214033

    也许“错误”在这里不是正确的词。不同的解释...

    【讨论】:

    • 哇!我在 Python 中发现了我生命中的第一个错误 =)
    【解决方案3】:

    a* 可以为空,给出(null)* 这对解释器没有意义。 (a*|b) 也可以为 null,因为它可以评估为 (b)(a*)。您可以使用 (a+)*,因此可以使用 (a+|b)*

    【讨论】:

    • 我完全同意你的观点,但无论如何 Mu Mind 是对的。
    • @f0b0s 本质上,@Mu 和我说的是同一件事——唯一的区别是多么明确——这就是为什么我赞成他先入为主。
    • 我还是不明白。如果不能重复 null 是一个特征。那么为什么 (a?)* 是有效的呢?它也可以给出 (null)*.
    • @Wang 我不知道为什么 (a?)* 是有效的,从逻辑上看它不应该是
    • 这是对已修复错误的还原。最近又修复了这个问题。叹!蟒蛇....
    【解决方案4】:

    Python拒绝(a*)*(a*|b)*其实有一个重要原因。由于* 是贪婪的,它匹配最长的字符串。问题是如果*修改的正则表达式为空,那么正则表达式解析器会尝试匹配尽可能多的空字符串重复。这意味着它将匹配您测试的字符串中任意两个字符之间的任意数量的空字符串。由于a* 在捕获组中,它必须捕获所有这些空字符串,这是不可能的。

    【讨论】:

      【解决方案5】:

      这似乎是一个 python 问题,看这个http://bugs.python.org/issue214033

      它也在 StackO 上 regex error - nothing to repeat

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-17
        • 1970-01-01
        • 2013-07-13
        • 2012-03-02
        相关资源
        最近更新 更多