這個問題類似於"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