需要帮助重构我的python脚本

时间:2009-08-10 19:18:14

标签: python

我有一个python脚本,它逐行处理文件,如果是行 匹配正则表达式,它调用一个函数来处理它。

我的问题是有更好的写入来重构我的脚本。该 脚本工作,但实际上,我需要保持缩进的权利 编辑器,因为我为我的文件添加了越来越多的正则表达式。

谢谢你的任何想法。 现在我的代码最终会像这样:

for line in fi.readlines():

       result= reg1.match(line)

       if result:
               handleReg1(result)

       else:
               result = reg2.match(line)

               if result:
                       handleReg2(result)
               else:
                       result = reg3.match(line)

                       if result:
                               handleReg3(result)
                       else:
                               result = reg4.match(line)

                               if result:
                                       handleReg4(result)
                               else:
                                       result = reg5.match(line)

                                       if result:
                                              handleReg5(result)

3 个答案:

答案 0 :(得分:12)

我转而使用将正则表达式映射到函数的数据结构。类似的东西:

map = { reg1: handleReg1, reg2: handleReg2, etc }

然后你只需循环它们:

for reg, handler in map.items():
    result = reg.match(line)
    if result:
       handler(result)
       break

如果您需要按特定顺序进行匹配,则需要使用列表而不是字典,但主体是相同的。

答案 1 :(得分:1)

这是一个微不足道的:

handlers = { reg1 : handleReg1, ... }

for line in fi.readlines():
    for h in handlers:
        x = h.match(line)
        if x:
            handlers[h](x)

如果有一行匹配多个正则表达式,则此代码将与您粘贴的代码不同:它将调用多个处理程序。添加break无济于事,因为正则表达式将以不同的顺序进行尝试,因此您最终会调用错误的顺序。因此,如果是这种情况,您应该遍历列表:

handlers = [ (reg1, handleReg1), (reg2, handleReg2), ... ]

for line in fi.readlines():
    for reg, handler in handlers:
        x = reg.match(line)
        if x:
            handler(x)
            break

答案 2 :(得分:0)

可能适合您的另一种方法是将所有正则表达式组合成一个巨大的正则表达式,并使用m.group()来检测哪个匹配。我的直觉说这应该更快,但我还没有测试过。

>>> reg = re.compile('(cat)|(dog)|(apple)')
>>> m = reg.search('we like dogs')
>>> print m.group()
dog
>>> print m.groups()
(None, 'dog', None)

如果您正在测试的正则表达式本身很复杂或使用匹配组,这会变得复杂。