【问题标题】:Regex Problem Group Name Redefinition?正则表达式问题组名称重新定义?
【发布时间】:2010-09-26 15:56:20
【问题描述】:

所以我有这个正则表达式:

(^(\s+)?(?P<NAME>(\w)(\d{7}))((01f\.foo)|(\.bar|\.goo\.moo\.roo))$|(^(\s+)?(?P<NAME2>R1_\d{6}_\d{6}_)((01f\.foo)|(\.bar|\.goo\.moo\.roo))$))

现在,如果我尝试对此进行匹配:

B048661501f.foo

我收到此错误:

编译中的文件“C:\Python25\lib\re.py”,第 188 行 返回_compile(模式,标志) _compile 中的文件“C:\Python25\lib\re.py”,第 241 行 raise error, v # 无效表达式 sre_constants.error:将组名“NAME”重新定义为组 9;是第 3 组

如果我不能在同一个正则表达式中为两种不同的情况定义两次相同的组,我该怎么办?

【问题讨论】:

  • 为我工作。回来; ('B048661501f.foo',无,'B0486615','B','0486615','01f.foo','01f.foo',无,无,无,无,无,无,无)
  • 您的正则表达式中有太多括号。单独删除不必要的会大大缩短时间。
  • @muhuk 有道理。只有一组名为NAME 和一组名为NAME2。显然问题中的正则表达式是正确的。

标签: python regex


【解决方案1】:

不,你不能有两个同名的组,这会以某种方式违背目的,不是吗?

你可能真正想要的是这个:

^\s*(?P<NAME>\w\d{7}|R1_(?:\d{6}_){2})(01f\.foo|\.(?:bar|goo|moo|roo))$

我尽可能重构了你的正则表达式。我做了以下假设:

你想(如果我错了,请纠正我):

  • 忽略字符串开头的空格
  • 将以下任一匹配到名为“NAME”的组中:
    • 一个字母后跟 7 位数字,或
    • "R1_",两次(6 位数 + "_"
  • 后跟:
    • "01f.foo"
    • "." 和("bar""goo""moo""roo"
  • 紧跟在字符串的末尾

你的意思也可能是:

^\s*(?P<NAME>\w\d{7}01f|R1_(?:\d{6}_){2})\.(?:foo|bar|goo|moo|roo)$

这是:

  • 忽略字符串开头的空格
  • 将以下任一匹配到名为“NAME”的组中:
    • 一个字母后跟 7 位数字和“01f”
    • "R1_",两次(6 位数 + "_"
  • 一个点
  • "foo""bar""goo""moo""roo"
  • 字符串的结尾

【讨论】:

  • 多个具有相同名称的命名捕获组是一个非常有用的功能。 Python 不支持,但 .NET 支持。
  • 很高兴知道,我会太严格以至于无法尝试/考虑它。
  • 似乎重复的命名捕获组在 regex 包中有效,但在 re 中无效
【解决方案2】:

与 Tamalak 的回复相反,在您的情况下重复使用相同的名称是有意义的。

您的正则表达式使用 python2.7 和 re2 编译。也许这个问题已经解决了。

【讨论】:

    【解决方案3】:

    以下答案涉及如何使上述正则表达式在 Python3 中工作。

    由于 Max 建议的 re2 模块在 Python3 中不起作用,因为 NameError: basestring。另一个替代方案是 regex 模块。

    regex 模块只是re 的增强版本,具有额外的附加功能。这 模块还允许在正则表达式中具有相同的组名。

    您可以通过以下方式安装它:

    sudo pip install regex
    

    如果您已经在程序中使用了rere2。只需执行以下操作即可导入regex 模块

    import regex as re
    

    【讨论】:

      【解决方案4】:

      here 所述,Python PyPi regex 模块支持分支重置功能

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        相关资源
        最近更新 更多