python,正则表达式,命名组和“逻辑或”运算符

时间:2009-05-24 11:18:21

标签: python regex

在python正则表达式中,命名和未命名组都使用'('和')'定义。这导致了一种奇怪的行为。正则表达式

"(?P<a>1)=(?P<b>2)"
与文本“1 = 2”一起使用的

将找到具有值“1”的命名组“a”并且命名组“b”具有值“2”。但是,如果我想使用“逻辑或”运算符并连接多个规则,请使用以下正则表达式:

"((?P<a>1)=(?P<b>2))|(?P<c>3)"

与相同文字“1 = 2”一起使用时,会找到值为“1 = 2”的未命名组。我知道regexp引擎会将“(”和“)”视为一个未命名的组,并将“a”和“b”组合在一起,并报告它已找到。但我不希望报告一个未命名的组,我只想使用“|”为了将多个正则表达式“粘合”在一起。没有创建任何寄生的未命名组。这是在python中这样做的方法吗?

1 个答案:

答案 0 :(得分:13)

使用(?:)删除未命名的群组:

r"(?:(?P<a>1)=(?P<b>2))|(?P<c>3)"

来自re的文档:

  

(?:...)非分组版本   常规括号。匹配任何东西   正则表达式在里面   括号,但子串匹配   由小组后无法检索   执行比赛或稍后参考   在模式中。

顺便说一下,交替运算符|的优先级非常低,以便在像你这样的情况下不需要括号。您可以在正则表达式中删除额外的括号,它将继续按预期工作:

r"(?P<a>1)=(?P<b>2)|(?P<c>3)"