Reputation: 21145
So I have this regex:
(^(\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))$))
Now if I try and do a match against this:
B048661501f.foo
I get this error:
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
If I can't define the same group twice in the same regex expression for two different cases, what do I do?
Upvotes: 14
Views: 16062
Reputation: 878
As mentioned here, Python PyPi regex
module supports a branch reset feature.
Upvotes: 1
Reputation: 85
The following answer deals with how to make the above regex work in Python3.
Since the re2 module as suggested by Max would not work in Python3, because of the
NameError: basestring
. Another alternative to this is the regex
module.
regex
module is just an enhanced version of re
with extra added features. This
module also allows to have same group names in the regex.
You can install it via:
sudo pip install regex
And if you have already been using re
or re2
in your program. Just do the following to import regex
module
import regex as re
Upvotes: 2
Reputation: 1183
Reusing the same name makes sense in your case, contrary to Tamalak's reply.
Your regex compiles with python2.7 and also re2. Maybe this problem has been resolved.
Upvotes: 9
Reputation: 338228
No, you can't have two groups of the same name, this would somehow defy the purpose, wouldn't it?
What you probably really want is this:
^\s*(?P<NAME>\w\d{7}|R1_(?:\d{6}_){2})(01f\.foo|\.(?:bar|goo|moo|roo))$
I refactored your regex as far as possible. I made the following assumptions:
You want to (correct me if I'm wrong):
"R1_"
, and two times (6 digits + "_"
)"01f.foo"
or"."
and ("bar"
or "goo"
or "moo"
or "roo"
)You could also have meant:
^\s*(?P<NAME>\w\d{7}01f|R1_(?:\d{6}_){2})\.(?:foo|bar|goo|moo|roo)$
Which is:
"R1_"
, and two times (6 digits + "_"
)"foo"
, "bar"
, "goo"
, "moo"
or "roo"
Upvotes: 8