如何在Python中拆分超长正则表达式
我有一个很长的正则表达式。
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)