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

3
以下代码运行良好
#!/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的每行最多72个字符的规定),但一直收到错误。我已经尝试了几乎所有的组合,包括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
>>>

你的模式中有字面上的空格,请用\s\s+替换它们(参见seq \d+)。 - Wiktor Stribiżew
2个回答

1

你需要考虑到模式中的空格。所有不在字符类内的字面空格都会被忽略。你可以使用\s+(1个或多个空格)或[ ]+(匹配1个或多个字面空格)来匹配空白。

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

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

查看正则表达式演示Python代码演示

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
谢谢,这个方法可行。今天早上我尝试过使用'\s',但没有加上'+',因为我只需要一个空格,但是我只在括号后的每个子语句之后才添加了它。我没有意识到我也应该在括号内部使用它。出于隐私原因,你能否将代码中的IP地址替换为192.168.0.0/15?在发布之前我忘记这样做了。我已经相应地更新了我的原始帖子。 - Fabou78
regex101无法获取共享URL,一旦解决将进行更新。 - Wiktor Stribiżew

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)

它与您的第一个示例一起运行良好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接