我有以下正则表达式似乎在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})|)
然后它有效。
我想在这里匹配的是gele
或le
或ge
或不存在。我也试过以下但没有运气。
((?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})|(.?))
关于这里发生了什么的任何想法
在塞缪尔的回答之后我已经测试了但似乎所有情况都不匹配
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。
答案 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})|)?