正则表达式问题组名称重新定义?

2024-06-09 18:22:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

(^(\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

我得到这个错误:

  File "C:\Python25\lib\re.py", line 188, in compile
    return _compile(pattern, flags)
  File "C:\Python25\lib\re.py", line 241, in _compile
    raise error, v # invalid expression
sre_constants.error: redefinition of group name 'NAME' as group 9; was group 3

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


Tags: nameinpyrefooliblinegroup
3条回答

不,你不能有两个同名的组,这会有点违背目的,不是吗?

你可能真正想要的是:

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

我尽可能重构了你的regex。我做了以下假设:

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

  • 忽略字符串开头的空白
  • 将下列任一项匹配到名为“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"
  • 绳子的末端

下面的答案涉及如何使上述regex在Python3中工作。

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

regex模块只是re的增强版本,具有额外的功能。这个 模块还允许在regex中使用相同的组名。

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

sudo pip install regex

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

import regex as re

重复使用同一个名字在你的情况下是有意义的,与塔玛拉克的回答相反。

您的regex使用python2.7和re2编译。也许这个问题已经解决了。

相关问题 更多 >