将python正则表达式代码拆分为多行

时间:2016-04-05 13:39:49

标签: python regex

以下代码正常运行

#!/usr/bin/python3

import re

preflist = 'ip prefix-list PL_FROM_7600 seq 255 permit 192.168.0.0/15 ge 20 le 25'
mymatch = re.search(r'(ip prefix-list) (?P<prefname>\w+) (?P<prefseq>seq \d+) (permit|deny)', preflist)

print(mymatch)

if mymatch is not None:
    print(mymatch.group('prefname'))
    print(mymatch.group('prefseq'))

并打印以下内容,证明我的正则表达式正常工作:

[user@serv:14:14:58~/scripts]$ ./retest.py
<_sre.SRE_Match object; span=(0, 42), match='ip prefix-list PL_FROM_7600 seq 255 permit'>

PL_FROM_7600

seq 255

所以现在我正在尝试使用re.VERBOSE将其拆分为多行(PEP8 符合maximum 72 characters per line},但不断出错。我已经尝试了几乎所有组合,包括re.compile和使用原始或不使用。

这是我直接从python控制台尝试的一个例子;

>>> preflist = 'ip prefix-list PL_FROM_7600 seq 255 permit 192.168.0.0/15 ge 20 le 25'

>>> myregex = re.compile(r'''
... (ip prefix-list)
... (?P<prefname>\w+)
... (?P<prefseq>seq \d+)
... (permit|deny)
... ''', re.VERBOSE)

>>> myregex
re.compile('\n(ip prefix-list)\n(?P<prefname>\\w+)\n(?P<prefseq>seq \\d+)\n(permit|deny)\n', re.VERBOSE)

>>> x = myregex.search(preflist)
>>> x
>>> print(x)
None

我尝试过的另一个例子......

>>> mypattern ='''
... (ip prefix-list)
... (\s?P<prefname>\w+)
... (\s?P<prefseq>seq \d+)
... (\spermit|deny)
... '''

>>> mypattern
'\n(ip prefix-list)\n(\\s?P<prefname>\\w+)\n(\\s?P<prefseq>seq \\d+)\n(\\spermit|deny)\n'

>>> preflist = 'ip prefix-list PL_FROM_7600 seq 255 permit 192.168.0.0/15 ge 20 le 25'
>>> preflist
'ip prefix-list PL_FROM_7600 seq 255 permit 192.168.0.0/15 ge 20 le 25'


>>> mymatch = re.search(mypattern, preflist,re.VERBOSE)

>>> mymatch
>>> print(mymatch)
None
>>>

2 个答案:

答案 0 :(得分:1)

您需要考虑模式中的空格。不在字符类内的所有文字空间都将被忽略。您可以将空格与\s+(1个或更多空格)或[ ]+匹配(以匹配1个以上的文字空格)。

我建议坚持\s因为它是唯一或多或少的可移植解决方案(在Java自由空间模式下,即使在字符类中也忽略空格)。

(ip\s+prefix-list)\s+
(?P<prefname>\w+)\s+
(?P<prefseq>seq\s+\d+)\s+
(permit|deny)

请参阅regex demoPython code demo

import re
myregex = re.compile(r'''
(ip\s+prefix-list)\s+
(?P<prefname>\w+)\s+
(?P<prefseq>seq\s+\d+)\s+
(permit|deny)
''', re.VERBOSE)
preflist = 'ip prefix-list PL_FROM_7600 seq 255 permit 192.168.0.0/15 ge 20 le 25'
mymatch = myregex.search(preflist)
print(mymatch)
# => <_sre.SRE_Match object; span=(0, 42), match='ip prefix-list PL_FROM_7600 seq 255 permit'>

答案 1 :(得分:1)

您可以通过拆分原始正则表达式来避免使用re.VERBOSE:

mymatch = re.search(r'(ip prefix-list) ' # comment
                 '(?P<prefname>\w+) ' # some text
                 '(?P<prefseq>seq \d+) ' # more comments
                 '(permit|deny)'
                 , preflist)

它适用于你的第一个例子。