条件表达式中带命名组的Python正则表达式

条件表达式中带命名组的Python正则表达式,python,regex,Python,Regex,我很难让正则表达式使用命名组和条件表达式工作。我已把这个问题简化为尽可能小的例子 正则表达式r“(?p\d)(?(x)a | b)”的意思似乎是“匹配一个数字,如果匹配一个数字(命名组x),也匹配一个a,但如果不匹配,则匹配b”。这应该相当于r”(\da|b) 但是,虽然它与yes子句匹配,但与no子句不匹配: >>> re.match(r"(?P<x>\d)(?(x)a|b)", "5a") <re.Match obj

我很难让正则表达式使用命名组和条件表达式工作。我已把这个问题简化为尽可能小的例子

正则表达式
r“(?p\d)(?(x)a | b)”
的意思似乎是“匹配一个数字,如果匹配一个数字(命名组
x
),也匹配一个
a
,但如果不匹配,则匹配
b
”。这应该相当于
r”(\da|b)

但是,虽然它与
yes
子句匹配,但与
no
子句不匹配:

>>> re.match(r"(?P<x>\d)(?(x)a|b)", "5a")
<re.Match object; span=(0, 2), match='5a'>
>>> re.match(r"(?P<x>\d)(?(x)a|b)", "b")
>>>
重新匹配(r“(?P\d)(?(x)a | b)”,“5a”) >>>关于匹配(r“(?P\d)(?(x)a | b)”,“b”) >>> 它也不适用于编号的组:

>>> re.match(r"(\d)(?(1)a|b)", "5a")
<re.Match object; span=(0, 2), match='5a'>
>>> re.match(r"(\d)(?(1)a|b)", "b")
>>>
关于匹配(r“(\d)(?(1)a | b)”,“5a”) >>>关于匹配(r“(\d)(?(1)a | b)”,“b”) >>>
我遗漏了什么?

问题是模式开头的组需要匹配。您可以通过将其设置为可选来修复它(在其后面添加一个
):

重新匹配(r“(?P\d)?(?(x)a | b)”,“5a”) >>> >>>关于匹配(r“(?(P\d)?(?(x)a | b)”,“b”) >>>
Argh,对。从不计算条件,因为
b
已经无法匹配,而没有
。我想我把我的例子简化了。我可能应该询问完整的模式,但我找到了另一种方法。
>>> re.match(r"(?P<x>\d)?(?(x)a|b)", "5a")
<_sre.SRE_Match object; span=(0, 2), match='5a'>
>>> 

>>> re.match(r"(?P<x>\d)?(?(x)a|b)", "b")
<_sre.SRE_Match object; span=(0, 1), match='b'>
>>>