从正则表达式中删除if elif的智能python方式



我有一系列按顺序调用的reg表达式。我需要检查第一个,然后第二个,然后第三个等等,一直到最后。我需要在匹配的字符串上做一些处理,所以我试图避免太多的逻辑,但在python中,不像perl,我认为我不能在if-elif-elif中执行赋值。block,我最后会做一个赋值,然后检查匹配,然后获取匹配的结果。例如:

m = re.search(patternA, string)
if m:
  stripped = m.group(0)
  xyz = stripped[45:67]
elif:
  m = re.search(patternB, string)
  if m:
    stripped = m.group(0)
    abc = stripped[5:7]
  elif:
     m = re.search(patternB, string)
     if m:
       stripped = m.group(0)
       txt = stripped[4:5]
     elif:
       ......

理想情况下,我想找到一个更好的结构,以确保我保留测试正则表达式的顺序,并且我可以将赋值合并到if-then语句中。例如:

if (m = re.search(patternA, string)):
  stripped = m.group(0)
  xyz = stripped[45:67]
elif (m = re.search(patternB, string)):
  stripped = m.group(0)
  abc = stripped[5:7]
...

处理这种情况的最python的方法是什么?谢谢。

用例是读取旧数据——非常旧的数据。然而,每个字符串可能包含关于特定值的信息,这些信息只有在正则表达式匹配特定模式时才会出现。因此,提取的变量高度依赖于匹配的内容。

for (pattern, slice) in zip([patternA, patternB, patternC],
                            [slice(45,67), slice(5,7), slice(4,5)]):
    m = re.search(pattern, string)
    if m:
        value = m.group(0)[slice]
        break
else:
    # Handle no match found for any pattern here

迭代正则表达式对及其匹配的相关部分,直到找到匹配。如果没有找到匹配项,则执行for循环的else子句。无论哪个模式匹配,在循环之后的value中都可以找到匹配的结果。

根据哪个"分支"成功设置不同的变量并不是一个好主意,因为你不一定知道在任何给定的时间设置了哪些变量。如果您确实希望为每个匹配项单独标记,那么使用字典将是更好的主意,因为您可以查询字典中设置了哪些键或哪些键。

value = {}
for (pattern, slice, key) in zip([patternA, patternB, patternC],
                                 [slice(45,67), slice(5,7), slice(4,5)],
                                 ['abc', 'xyx', 'txt']):
    m = re.search(pattern, string)
    if m:
        value[key] = m.group(0)[slice]
        break
但是,一般的想法是要注意,您的if语句链就像硬编码的迭代,因此您只需要确定每个if/elif子句的哪些部分与前面的部分不同,并创建一个可以迭代的列表。

最新更新