2016-04-08 38 views
-2

我有以下的正則表達式似乎在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})|) 

那麼它的工作原理如下因素。

我試圖在這裏匹配的所有內容是存在的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前綴列表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前綴列表PL_FROM_7600 SEQ 30許可證192.168.1.80/28 GE 23
  4. 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。

+0

我已經被拒絕了,我不知道我的帖子出了什麼問題? – Fabou78

回答

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) 

和i之後更換

\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})|)? 
+0

好抓!在Regex101等在線測試人員中,這是一個常見的缺點:您不能將它們看作是獨立的字符串,最終沒有換行符。順便說一句,現在封閉組是可選的,最後一個'|'是多餘的。 –

+0

謝謝您的建議 –

+0

Merci Samuel。當'XX XX XX'時,它似乎工作正常,但當'XX XX'或'XX XX'時它沒有捕獲相應的組。我也理解你對正則表達式的修改所做的改變,但是我沒有看到'prefnet'這個位,你說「這個差異是爲你的」。你可以花費你的解釋嗎? – Fabou78

相關問題