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)
是否值得麻烦,我将留给读者来决定