我有以下的正則表達式似乎在regex101上正常工作。 正如你所看到的,我的四種可能的組合是匹配的。有效的正則表達式不能在python中工作
現在,如果我想在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})|(.?))
什麼是怎麼回事
EDIT1任何想法:
後塞繆爾答案我已經測試過,但似乎所有的情況下,不匹配
- IP前綴列表PL_FROM_7600 seq 10 permit 192.168.1.80/28
- ip prefix-list PL_FROM_7600 seq 20 permit 192.168.1.80/28 ge 23 le 25
- IP前綴列表PL_FROM_7600 SEQ 30許可證192.168.1.80/28 GE 23
- IP前綴列表PL_FROM_7600 SEQ 40許可證192.168.1.80/28文件23
1和2是匹配的但不是3和4
我已經修改了薩穆埃爾的正則表達式:
(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。
我已經被拒絕了,我不知道我的帖子出了什麼問題? – Fabou78