有效的正则表达式不能在python中工作

时间:2016-04-08 20:58:32

标签: python regex

我有以下正则表达式似乎在regex101上工作正常。 如您所见,我的四种可能组合相匹配。

现在,如果我想在python中实现这一点,当我尝试匹配类似于regex101字符串字段中第一行的行(在网络地址后面没有任何行)时,我根本得不到匹配。这是代码

import re 

l_side = 'ip prefix-list PL_FROM_7600 seq 40 permit 192.168.10.0/23'

myregex = re.compile(r'''
(ip\sprefix-list)\s
(?P<prefnam>\w+)\s
(?P<prefseq>seq\s\d+)\s
(permit|deny)\s
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}\/[1-3]?\d)\s
((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|)
''', re.VERBOSE)
l_match = myregex.search(l_side)

print(l_match.group('prefnam'))
print(l_match.group('prefgele'))

这是我得到的错误

Traceback (most recent call last):
  File "./testing.py", line 19, in <module>
    print(l_match.group('prefnam'))
AttributeError: 'NoneType' object has no attribute 'group'

如果我从正则表达式中删除了以下内容

((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|)

然后它有效。

我想在这里匹配的是gelelege或不存在。我也试过以下但没有运气。

((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|(.?))

关于这里发生了什么的任何想法

EDIT1:

在塞缪尔的回答之后我已经测试了但似乎所有情况都不匹配

  1. ip prefix-list PL_FROM_7600 seq 10 permit 192.168.1.80/28
  2. ip prefix-list PL_FROM_7600 seq 20 permit 192.168.1.80/28 ge 23 le 25
  3. ip prefix-list PL_FROM_7600 seq 30 permit 192.168.1.80/28 ge 23
  4. ip prefix-list PL_FROM_7600 seq 40 permit 192.168.1.80/28 le 23
  5. 1和2匹配但不是3和4

    我已将Samuel正则表达式修改为:

    (ip\sprefix-list)\s
    (?P<prefnam>\w+)\s
    (?P<prefseq>seq\s\d+)\s
    (permit|deny)\s
    (?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d)
    ((\s(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2}))|
    (\s(?P<prefge>ge\s\d{1,2}))|
    (\s(?P<prefle>le\s\d{1,2})))?
    

    现在似乎符合所有情况。谢谢Sam。

1 个答案:

答案 0 :(得分:2)

有了这个正则表达式吗?

import re 

l_side = 'ip prefix-list PL_FROM_7600 seq 40 permit 192.168.10.0/23'

myregex = re.compile(r'''
(ip\sprefix-list)\s
(?P<prefnam>\w+)\s
(?P<prefseq>seq\s\d+)\s
(permit|deny)\s
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d)(\s
(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|)?
''', re.VERBOSE)
l_match = myregex.search(l_side)

print(l_match.group('prefnam'))
#print(l_match.group('prefgele'))

差异是

(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}\/[1-3]?\d)

替换为

(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d)

并在我更换

之后
\s
((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|)

通过

(\s
(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|)?