python - 在条件表达式中具有命名组的 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")
>>>
我错过了什么?
解决方案
问题是模式开始处的组需要匹配。您可以通过使其成为可选来修复它(?
在它之后添加一个):
>>> 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'>
>>>
推荐阅读
- javascript - JavaScript计算的日期在周末登陆,如何更改为下周一
- angular - 如何从数据库列中读取文件路径并使用角度显示内容
- c - 如何“重建”腐烂的**char?
- amazon-s3 - 如何限制公共访问
- javascript - 当请求和响应在 express 中作为参数交换时,为什么代码不起作用?
- arrays - 如果 response.data 是对象而不是数组,我该如何返回?地图不适用于我下面的代码
- discord.net - Discord.net 如何处理 Auditlog.data
- apache-kafka - Kafka:代理可能无法通过 CLI 使用
- xamarin.forms - 在 CollectionView 的空组中插入标签
- javascript - -webkit-filter: blur() 不起作用 vue js