Python正则表达式:命名组中的重复名称

12

有没有办法在Python的正则表达式命名组中使用相同的名称? 例如:(?P<n>foo)|(?P<n>bar)

使用案例: 我试图使用以下正则表达式捕获typeid
/(?=videos)((?P<type>videos)/(?P<id>\d+))|(?P<type>\w+)/?(?P<v>v)?/?(?P<id>\d+)?
从以下字符串中:

  • /channel/v/123
  • /ch/v/41500082
  • /channel
  • /videos/41500082

目前我得到了错误消息: redefinition of group name 'id' as group 6; was group 3


2
一个命名捕获组是唯一的,除非您使用分支重置,这仅受新版 regex 模块支持:(?|...) - 您是否有想要实现的在线演示?此外,条件正则表达式或回顾后发断言可能已经足够。 - Jan
2个回答

21

答案是:Python re 不支持同名组

Python PyPi regex 模块 支持同名命名捕获组:

同一名称可以被多个组使用,后面的捕获将“覆盖”早期的捕获。该组的所有捕获都将在匹配对象的 captures 方法中可用。

这里还有一个 Python 2.7演示

import regex
s = "foo bar"
rx = regex.compile(r"(?P<n>foo)|(?P<n>bar)")
print([x.group("n") for x in rx.finditer(s)])
// => ['foo', 'bar']

此外,在其他情况下,当您想要匹配多个备选项并将它们的一部分捕获到一个组中时,可以使用分支重置功能

分支重置

(?|...|...)

捕获组编号将在备选项之间被重用,但具有不同名称的组将具有不同的组编号。

例子:

>>> regex.match(r"(?|(first)|(second))", "first").groups()
('first',)
>>> regex.match(r"(?|(first)|(second))", "second").groups()
('second',)

请注意,只有一个组。


1

你可以轻松地转换

match(r'(?P<n>foo)|(?P<n>bar)', s)

进入

match(r'(?P<n>foo)', s) or match(r'(?P<n>bar)', s)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接