如何在python中拆分非常长的正则表达式

时间:2014-05-28 12:34:38

标签: python regex

我有一个非常长的正则表达式。

 vpa_pattern = '(VAP) ([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}): (.*)'

我的代码匹配组如下:

 class ReExpr:
def __init__(self):
    self.string=None

def search(self,regexp,string):
    self.string=string
    self.rematch = re.search(regexp, self.string)
    return bool(self.rematch)

def group(self,i):
    return self.rematch.group(i)

 m = ReExpr()

 if m.search(vpa_pattern,line):
    print m.group(1)
    print m.group(2)
    print m.group(3)

我试图通过以下方式将正则表达式模式设置为多行,

vpa_pattern = '(VAP) \
    ([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}):\
    (.*)'

或者甚至我试过:

 vpa_pattern = re.compile(('(VAP) \
    ([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}):\
    (.*)'))

但上述方法无效。对于每个组,我在打开和关闭括号后有一个空格()。我想当我分成多行时,它不会捡起来。

3 个答案:

答案 0 :(得分:4)

看看re.X flag。它允许注释并忽略正则表达式中的空格。

a = re.compile(r"""\d +  # the integral part
               \.    # the decimal point
               \d *  # some fractional digits""", re.X)

答案 1 :(得分:3)

Python允许在括号中包含部分文本字符串:

>>> text = ("alfa" "beta"
... "gama")
...
>>> text
'alfabetagama'

或在您的代码中:

text = ("alfa" "beta"
        "gama" "delta"
        "omega")
print text

将打印

"alfabetagamadeltaomega"

答案 2 :(得分:1)

其实非常简单。您已使用{}表示法。再次使用它。所以而不是:

'([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}):'

这只是[0-9A-Fa-f]{2}:重复6次,你可以使用:

'([0-9A-Fa-f]{2}:){6}'

我们甚至可以使用\d来表示数字来进一步简化:

'([\dA-Fa-f]{2}:){6}'
  

注意:取决于您使用的re功能,you can pass in re.IGNORE_CASE并将该块简化为[\da-f]{2}:

所以你最后的正则表达式是:

'(VAP) ([\dA-Fa-f]{2}:){6} (.*)'