我有一系列按顺序调用的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
子句的哪些部分与前面的部分不同,并创建一个可以迭代的列表。