首页 > 解决方案 > 替换 Python if-else 语句中的冗余正则表达式调用

问题描述

这是一个按情况切换的样式代码,按预期工作。

我想做的是:

我想在每个分支上重复调用完全相同的 re.match() 2 次是非常低效的。

Python中是否有任何可能的替代或更复杂的方式来“重用” if 语句中使用的 re.match 对象?

尝试搜索最佳实践并阅读手册,但最终一无所获。

无法按照此处的建议分配 re.match() 值或使用 re.compile() ,因为我有 elif 子句:

冗余 If 语句和正则表达式

我可以看到,从 Python 3.8 可以在 if 语句中分配一个变量,但我正在使用 Python 3.7。

如何在 IF 条件中分配一个变量,然后返回它?

如果您能提供帮助,将不胜感激。

提前致谢。

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) ...

...

标签: pythonregex

解决方案


这就是添加海象运算符的原因;没有它就没有好的解决方案。保持短路和避免重新测试的唯一方法是嵌套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。唯一可用的简化是,如果您对任何匹配(组是可互换的)采取相同的操作,在这种情况下,模式上的单个内部循环就足够了,但这里看起来不是这种情况。


推荐阅读