2009-04-11 52 views
1

這個問題類似於"How to concisely cascade through multiple regex statements in Python",除了不是匹配一個正則表達式,而是做一些我需要確保我不匹配一堆正則表達式的東西,並且如果沒有找到匹配(aka我有有效的數據)然後做一些事情。我找到了一種辦法,但我認爲必須有更好的辦法,特別是如果我最終得到許多正則表達式。在Python中應用多個負面的正則表達式

基本上我過濾了一些不好的東西(「」,\\「等),當我從HTML文檔中取出一個看起來像有效的URL的東西時,它的URL會被過濾掉,但它變成了JavaScript的一部分因此需要進行評估,因此需要進行轉義字符)我不能使用美麗的湯來處理這些頁面,因爲它們遠沒有被破壞(實際上我使用BeautifulSoup,然後回落到我的醜陋但可行的解析器)

到目前爲止,我發現以下工作相對比較好:我在主循環外編譯了一個字典或正則表達式(所以我只需要編譯一次,但每次使用它都會從速度提高中受益),然後循環通過這個字典的URL,如果有匹配,那麼URL是不好的,如果不是,那麼URL是好的:

regex_bad_url = {"1" : re.compile('\"\"'), 
       "2" : re.compile('\\\"')} 

其次:

url_state = "good" 

for key, pattern in regex_bad_url_components.items(): 
    match = re.search(pattern, url) 
    if (match): 
     url_state = "bad" 

if (url_state == "good"): 
# do stuff here ... 

現在明顯想到的是用正則表達式 「或」( 「|」),即:

re.compile('(\"\"|\\\")') 

從而降低了比較的次數和諸如此類的東西,但它使得拍攝更加困難(每比較一個表達式,我可以輕鬆添加打印語句,例如:

print "URL: ", url, " matched by key ", key 

因此,有兩種方式來獲得兩全其美(即最小數量的比較),但仍然能夠打印出哪個正則表達式與URL匹配,或者我只需要咬緊牙關,讓我的速度更慢但更容易調試時調試代碼,然後將所有正則表達式一起放到一行中生產? (這意味着更多的編程和代碼維護以及可能的問題)。

更新:

由戴維·韋伯回答得好,所以對於這個實際的代碼是這樣:

match = re.search(r'(?P<double_quotes>\"\")|(?P<slash_quote>\\\")', fullurl) 
if (match == None): 
    # do stuff here ... 
else: 
    #optional for debugging 
    print "url matched by", match.lastgroup 

回答