Python 有没有办法将正则表达式捕获组统一到不同的替代分支中?
假设我有这样的代码:Python 有没有办法将正则表达式捕获组统一到不同的替代分支中?,python,idioms,re,capture-group,Python,Idioms,Re,Capture Group,假设我有这样的代码: import re rx = re.compile(r'(?:(\w{2}) (\d{2})|(\w{4}) (\d{4}))') def get_id(s): g = rx.match(s).groups() return ( g[0] if g[0] is not None else g[2], int(g[1] if g[1] is not None else g[3]), ) print(get_id('A
import re
rx = re.compile(r'(?:(\w{2}) (\d{2})|(\w{4}) (\d{4}))')
def get_id(s):
g = rx.match(s).groups()
return (
g[0] if g[0] is not None else g[2],
int(g[1] if g[1] is not None else g[3]),
)
print(get_id('AA 12')) # ('AA', 12)
print(get_id('BBBB 1234')) # ('BBBB', 1234)
这就是我想要的,但它要求我检查每个捕获组,以检查哪个组实际捕获了子字符串。如果备选方案的数量很高,这可能会变得很麻烦,因此我宁愿避免这种情况
我尝试使用命名捕获,但是(?:(p\w{2})(?p\d{2})|(?p\w{4})(?p\d{4}))
只会引发一个错误
答案中的技巧不起作用,因为(\w{2}(?=\d{2})\w{4}(?=\d{4}))(\d{2}\d{4})
将捕获错误数量的数字,并且由于我不想进入的原因,我无法手动优化备选方案的顺序
有没有更惯用的方式来写这篇文章?似乎有!从文件:
(?(id/name)yes | no)匹配yes模式,如果id/name匹配的组,
除此之外,(可选)无模式。
这个例子是这样的:
rx=re.compile(r'(?P(?P)\w{2}(?=\d{2})|(?P)\w{4}(?=\d{4}))(?P(?(前缀_-two))\d{2}|(?(前缀_-four))\d{4})
def get_id:
m=接收匹配(s)
如果不是m:
返回(无,无,)
返回m.group('前缀','数字')
打印(获取id('AA 12'))#('AA',12)
打印(获取id('BB 1234'))#('BB',12)
打印(获取id('BBBB 12'))#(无,无)
打印(获取id('BBBB1234'))#('BBBB',1234)
是否值得麻烦,我将留给读者来决定