Pythonic编写多个正则表达式测试的方法

时间:2016-10-07 12:51:30

标签: python

当有多个正则表达式模式进行测试时,如何以Pythonic方式编写,如果测试成功,则如何提取匹配的组?

也就是说,Pythonic等效于以下代码片段是什么?

if re.match(pattern1, string):
    m = re.match(pattern1, string)
    grps = m.groups()
    ...[process matched groups for pattern1]...
elif re.match(pattern2, string):
    m = re.match(pattern2, string)
    grps = m.groups()
    ...[process matched groups for pattern2]...
elif re.match(pattern3, string):
    m = re.match(pattern3, string)
    grps = m.groups()
    ...[process matched groups for pattern3]...

3 个答案:

答案 0 :(得分:3)

patterns = [pattern1, pattern2, pattern3]
for pattern in patterns:
    m = re.match(pattern, string)
    if m:
        grps = m.groups()
        ...
        break

答案 1 :(得分:0)

为处理结果组的每个模式创建一个函数。然后你可以使用列表理解:

lst = [(pattern1, func1), (p2, f2)...]
results = [func(match.groups()) for (match, func) in [(re.match(patt, theStr), func) for (patt, func) in lst] if match]

答案 2 :(得分:0)

基本上我想要的是:

m = re.match(pattern1, string)
if m:
    grps = m.groups()
    print(pattern1)
else:
    m = re.match(pattern2, string)
    if m:
        grps = m.groups()
        print(pattern2)

这是我找到的最好的风格,它模仿了许多语言中存在的case语句:

while True:
    m = re.match(pattern1, string)
    if m:
        grps = m.groups()
        print(pattern1)
        break
    m = re.match(pattern2, string)
    if m:
        grps = m.groups()
        print(pattern2)
        break

不确定我是Python中case的发明者。但是从文本中我们可以看到第二个具有恒定缩进,而第一个具有线性缩进。算法教授告诉我们O(1)优于O(n)