代码之家  ›  专栏  ›  技术社区  ›  n179911

需要帮助重构我的python脚本

  •  3
  • n179911  · 技术社区  · 15 年前

    我有一个python脚本,它一行一行地处理一个文件,如果 匹配一个regex,它调用一个函数来处理它。

    我的问题是是否有更好的编写来重构我的脚本。这个 脚本有效,但实际上,我需要将缩进保持在 编辑器,因为我为我的文件添加了越来越多的regex。

    谢谢你的建议。 现在我的代码结束如下:

    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 回复  |  直到 15 年前
        1
  •  12
  •   samtregar    15 年前

    我将切换到使用数据结构将regex映射到函数。类似:

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

    然后你只需循环它们:

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

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

        2
  •  1
  •   ilya n.    15 年前

    下面是一个小问题:

    handlers = { reg1 : handleReg1, ... }
    
    for line in fi.readlines():
        for h in handlers:
            x = h.match(line)
            if x:
                handlers[h](x)
    

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

    handlers = [ (reg1, handleReg1), (reg2, handleReg2), ... ]
    
    for line in fi.readlines():
        for reg, handler in handlers:
            x = reg.match(line)
            if x:
                handler(x)
                break
    
        3
  •  0
  •   Nelson    15 年前

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

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

    如果要测试的regexp本身很复杂,或者使用匹配组,则情况会变得复杂。