以下代码正常运行
#!/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
>>>
答案 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 demo和Python 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)
它适用于你的第一个例子。