2010-07-07 82 views
1

在Python中,我編譯像這樣正則表達式模式:正則表達式不匹配什麼,我認爲它應該

rule_remark_pattern = re.compile('access-list shc-[(in)(out)] [(remark)(extended)].*') 

我希望它匹配任何下列行:

access-list shc-in remark C883101 Permit http from UPHC outside to Printers inside 
access-list shc-in extended permit tcp object-group UPHC-Group-Outside object-group PRINTER-Group-Inside object-group http-https 
access-list shc-out remark C890264 - Permit (UDP 123) from UPHC-Group-Inside to metronome.usc.edu 
access-list shc-out extended permit udp object-group UPHC-Group-Inside host 68.181.195.12 eq ntp 

不幸的是,它不匹配任何一個。但是,如果我寫正則表達式爲:

rule_remark_pattern = re.compile('access-list shc-in [(remark)(extended)].*') 

它匹配前2就好了。

同樣,如果我寫的:

rule_remark_pattern = re.compile('access-list shc-out [(remark)(extended)].*') 

它匹配的最後2

任何人都知道這是怎麼回事呢?

回答

2

這主要是因爲你完全錯誤地理解如何「界定的替代品」工程正則表達式:

 
access-list shc-(in|out) (remark|extended).* 

您試圖創建字符類。角色類中的每個角色都是獨立的,而類本身實際上只匹配允許列表中的單個角色。所以,你試試:

[(in)(out)]

真的是一樣的

[intou(())]

這實際上是一樣的,因爲[intou()]在字符類重複字符被忽略。

3

我的正則表達式不是基於Python的,但假設它是標準的東西,我認爲你誤解了'['和']'的使用。他們代表字符類別,看起來您需要替換

嘗試用「(word1 | word2)」替換您的「[(word1)(word2)]」構造。

編輯:剛纔檢查Python文檔(這裏:http://docs.python.org/library/re.html)(即應該影響這個答案的準確性沒有),我沒有看到Python的使用regexen,我已經習慣了什麼之間的任何相關差異

相關問題