如何在Python中拆分超长正则表达式

5 投票
3 回答
1419 浏览
提问于 2025-04-18 07:49

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

 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 个回答

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 函数,你可以传入 re.IGNORE_CASE,这样可以把那部分简化成 [\da-f]{2}:

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

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

在Python中,如果把文本字符串放在括号里,可以把它们分成几部分来写:

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

或者在你的代码中:

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

这样会输出

"alfabetagamadeltaomega"
8

看看这个 re.X 标志。它可以让你在正则表达式中添加注释,并且会忽略空格。

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

撰写回答