python - 替换 Python if-else 语句中的冗余正则表达式调用
问题描述
这是一个按情况切换的样式代码,按预期工作。
我想做的是:
- 通过匹配多个正则表达式 AND 来排序候选人,
- 通过正则表达式分组将其组件解析为片段。
- 正则表达式语法和短语本身就很好 - 所以最好专注于如何改进(或替换) if 子句本身。
我想在每个分支上重复调用完全相同的 re.match() 2 次是非常低效的。
Python中是否有任何可能的替代或更复杂的方式来“重用” if 语句中使用的 re.match 对象?
尝试搜索最佳实践并阅读手册,但最终一无所获。
无法按照此处的建议分配 re.match() 值或使用 re.compile() ,因为我有 elif 子句:
我可以看到,从 Python 3.8 可以在 if 语句中分配一个变量,但我正在使用 Python 3.7。
如果您能提供帮助,将不胜感激。
提前致谢。
candidates = [
'WTI CRUDE FUTURE Jul20',
'Crude Oil Option C31',
'O-CLK20_C43.00',
'AMZN US 01/17/20 P1440',
...
]
for item in candidates:
if re.match(r'([\w ]+) FUTURE (\w{3})(\d{2})', item):
redundant_call = re.match(r'([\w ]+) FUTURE (\w{3})(\d{2})', item):
Do something with .group(1), group(2) ...
elif re.match(r'([\w ]+) Option (P|C)([\d\.]+)', item):
redundant_call = re.match(r'([\w ]+) Option (P|C)([\d\.]+)', item):
Do something with .group(1), group(2) ...
elif re.match(r'O-(\w{2,3})([F-Z])(\d{2})_(P|C)([\d.]+)', item):
redundant_call = re.match(r'O-(\w{2,3})([F-Z])(\d{2})_(P|C)([\d.]+)', item):
Do something with .group(1), group(2) ...
...
解决方案
这就是添加海象运算符的原因;没有它就没有好的解决方案。保持短路和避免重新测试的唯一方法是嵌套if/else
块,这会导致丑陋的“箭头模式”代码:
for item in candidates:
m = re.match(r'([\w ]+) FUTURE (\w{3})(\d{2})', item)
if m:
# Do something with m.group(1), m.group(2) ...
else:
m = re.match(r'([\w ]+) Option (P|C)([\d\.]+)', item)
if m:
# Do something with .group(1), group(2) ...
else:
m = re.match(r'O-(\w{2,3})([F-Z])(\d{2})_(P|C)([\d.]+)', item)
if m:
# Do something with .group(1), group(2) ...
要么这样做,要么升级到 3.8。唯一可用的简化是,如果您对任何匹配(组是可互换的)采取相同的操作,在这种情况下,模式上的单个内部循环就足够了,但这里看起来不是这种情况。
推荐阅读
- c# - 不同文化中的默认本地化 XML 文件
- google-api - 在 compute.googleapis.com/instance/cpu/reserved_cores 上需要 api 结果解释
- json - 使用 Laravel 获取特定类别的所有帖子记录
- python - 如何在关键云代工厂上使用 jaydebeapi 部署烧瓶应用程序
- asp.net-core - 当请求大于 kestrel 中的 MaxRequestBodySize 时设置状态码
- python - Python - 防止以特定格式打开文件
- indexing - Postgresql:分区表上的索引
- python - 面临实现多项式回归的问题:AttributeError: 'PolynomialFeatures' object has no attribute 'predict'
- python - 如何在 Django 中搜索产品?
- python - 使用 Informatica BDM 命令任务触发 python 脚本