条件表达式中带命名组的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'>
>>>