首页 > 解决方案 > 在条件表达式中具有命名组的 Python 正则表达式

问题描述

我无法使用命名组和条件表达式使正则表达式工作。我已将问题简化为最小的示例。

正则表达式r"(?P<x>\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")
>>>

它也不适用于编号组:

>>> re.match(r"(\d)(?(1)a|b)", "5a")
<re.Match object; span=(0, 2), match='5a'>
>>> re.match(r"(\d)(?(1)a|b)", "b")
>>>

我错过了什么?

标签: pythonregex

解决方案


问题是模式开始处的组需要匹配。您可以通过使其成为可选来修复它(?在它之后添加一个):

>>> 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'>
>>> 

推荐阅读