python - 有没有办法在不同的替代分支中统一正则表达式捕获组?
问题描述
假设我有这样的代码:
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<s>\w{2}) (?P<id>\d{2})|(?P<s>\w{4}) (?P<id>\d{4}))
只会引发错误。
在正则表达式中针对多个案例统一捕获组的答案中的技巧不起作用,因为(\w{2}(?= \d{2})|\w{4}(?= \d{4})) (\d{2}|\d{4})
将捕获错误数量的数字,并且由于我不想进入的原因,我无法手动优化替代方案的顺序。
有没有更惯用的方式来写这个?
解决方案
好像有!从re
文档:
(?(id/name)yes|no) Matches yes pattern if the group with id/name matched,
the (optional) no pattern otherwise.
这使得这个例子:
rx = re.compile(r'(?P<prefix>(?P<prefix_two>)\w{2}(?= \d{2})|(?P<prefix_four>)\w{4}(?= \d{4})) (?P<digits>(?(prefix_two))\d{2}|(?(prefix_four))\d{4})')
def get_id(s):
m = rx.match(s)
if not m:
return (None, None,)
return m.group('prefix', 'digits')
print(get_id('AA 12')) # ('AA', 12)
print(get_id('BB 1234')) # ('BB', 12)
print(get_id('BBBB 12')) # (None, None)
print(get_id('BBBB 1234')) # ('BBBB', 1234)
是否值得麻烦,我会留给读者。
推荐阅读
- javascript - 我有一个随机显示标记的 SVG 地图。我可以准确地放置它们以告诉 SVG 地图上的实际位置吗?
- python - 如何在两行上加入数据框和字典
- c# - 从状态向量中找到真正的异常
- swift - 加载从 WKWebView 中注入的 AJAX GET 检索的 PDF 二进制文件到 PDFKit
- gwt - 如何从 GWT 上的 php Web 服务获取有效响应
- ios - 使用 Firebase 云功能时如何在 iOS 中发送通知?
- php - 从 WooCommerce 电子邮件中隐藏付款说明已完成的订单通知
- angular - Angular PWA 动态更改清单
- python - 如何修复地理定位 API URL 以使用特定参数
- c# - 索引超出范围,但我知道列在那里