所以我有这个正则表达式:
(^(\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
如果我不能在同一个正则表达式中为两个不同的情况定义相同的组两次,我该怎么办?
答案 0 :(得分:7)
不,你不能有两个同名的小组,这会以某种方式违抗目的,不是吗?
你可能真正想要的是:
^\s*(?P<NAME>\w\d{7}|R1_(?:\d{6}_){2})(01f\.foo|\.(?:bar|goo|moo|roo))$
我尽可能重构你的正则表达式。我做了以下假设:
你想(如果我错了,请纠正我):
"R1_"
,两次(6位+ "_"
)"01f.foo"
或"."
和("bar"
或"goo"
或"moo"
或"roo"
)你也可能意味着:
^\s*(?P<NAME>\w\d{7}01f|R1_(?:\d{6}_){2})\.(?:foo|bar|goo|moo|roo)$
这是:
"R1_"
,两次(6位+ "_"
)"foo"
,"bar"
,"goo"
,"moo"
或"roo"
答案 1 :(得分:6)
与Tamalak的回复相反,重复使用相同的名称是有道理的。
你的正则表达式用python2.7和re2编译。也许这个问题已经解决了。
答案 2 :(得分:0)
以下答案涉及如何使上述regex在Python3中工作。
由于Max建议的re2模块在Python3中不起作用,因为
NameError: basestring
。另一个替代方法是regex
模块。
regex
模块只是re
的增强版,具有附加的功能。这个
模块还允许在正则表达式中使用相同的组名。
您可以通过以下方式安装它:
sudo pip install regex
并且如果您已经在程序中使用re
或re2
。只需执行以下操作即可导入regex
模块
import regex as re
答案 3 :(得分:0)
如前所述here,Python PyPi regex
模块支持分支重置功能。