regex 在Python中跨多个模式重用命名组,涉及`|`运算符与单编译[重复]

pod7payv  于 2023-03-31  发布在  Python
关注(0)|答案(1)|浏览(95)

此问题在此处已有答案

python regex: duplicate names in named groups(2个答案)
10天前关闭。
我想把这条线与任何一种模式匹配。
模式1:fname lname
模式二:lname,fname
示例字符串:

Frank Delo
Delo,Frank

groupdict()两个字符串的输出应返回相同的结果

{"fname":"Frank",
 "lname":"Delo"
}

我是这么试的

r1 = "^(?P<fname>[a-zA-Z]+)(?: (?P<lname>[a-zA-Z]+))?$"
r2 = "^(?P=lname),(?P=fname)$"

print(re.match("|".join([r1,r2]), "Frank Delo").groupdict()) # Works fine
print(re.match("|".join([r1,r2]), "Delo,Frank").groupdict()) # Doesn't match

在''后面不能使用命名组引用吗|”接线员?
另外,请注意,我不想单独编译这些模式

ncgqoxb0

ncgqoxb01#

有两个问题:

  • (?P=lname)是一个 backreference,这意味着它匹配任何(?P<lname>)匹配的内容,这不是你想要的,因为这是为了覆盖r1根本不匹配的情况。
  • 要解决上述问题,您需要再次使用(?P<lname>),这样无论哪种正则表达式适用(r1r2),您都可以定义该命名组。然而re不支持此功能。好消息是,更丰富的regex包 * 支持它。

然后我们得到:

import regex as re

r1 = "^(?P<fname>[a-zA-Z]+) (?P<lname>[a-zA-Z]+)$"
r2 = "^(?P<lname>[a-zA-Z]+),(?P<fname>[a-zA-Z]+)$"

r = "|".join([r1,r2])

print(re.match(r, "Frank Delo").groupdict()) # Works fine
print(re.match(r, "Delo,Frank").groupdict()) # Works fine too

相关问题