2015-09-08 47 views
1

如何將這三個re.compile加入統一的正則表達式中,然後將其用於負向預測?即如果字符串s中沒有匹配,則:[做某事]。當加入多個re.compile時插入負面預測

regex_eur = re.compile(r"\b(Euro)\b|\b(EUR)\b|\b(\€)\b", re.I) 
regex_gbp = re.compile(r"\b(Pound)\b|\b(GBP)\b|\b(\£)\b", re.I) 
regex_jpy = re.compile(r"\b(Yen)\b|\b(JPY)\b", re.I) 

我嘗試:

regex_all = re.compile(r"\b(?:%s)\b" % "|".join([regex_eur, regex_gbp, regex_jpy])) 

if not re.search(regex_all, s): 
    #Do something 

注意,這不使用負前瞻,只是if not這似乎並沒有工作。如果這確實是正確的方法,我不確定如何將負向預測附加到.join


編輯:我客觀的澄清。

我想確保沒有任何正則表達式「關鍵字」在字符串中。即以下都不允許使用:「歐元」,「歐元」,「歐元」,「英鎊」,「英鎊」,「英鎊」等。

我已經決定了,因爲單詞邊界\b是實施重要的是使用正則表達式。

+0

我在這裏看不到任何背影。只有一個大的基於正則表達式的正則表達式應該適合你 – anubhava

+0

關於術語:是不是隻是一個向前看的負面lookbehind? – anderas

+0

@anderas對不起,也許我誤解了一個負面的後臺是什麼。我的目標只是確保沒有任何正則表達式「關鍵字」在字符串中。即以下都不允許使用:歐元,歐元,歐元,英鎊,英鎊,英鎊等。 – Winterflags

回答

2

我認爲你正在尋找此negative lookahead regex

regex = re.compile(r"^(?!.*(?:€|£|\b(?:Euro?|Pound|GBP|Yen|JPY)\b))", re.UNICODE | re.I) 

其中如果上述任何字符串輸入被發現基本上都會失敗的比賽。請注意,£將不需要0​​(字邊界),因爲這些貨幣符號不被視爲單詞字符。

+1

謝謝,這可行!謝謝關於貨幣符號的信息。需要從頭開始創建一個新的正則表達式,而不是加入現有的編譯模式,但這並不是什麼大問題(並且考慮到邊界不應用於貨幣符號,可能是最簡單的:)) – Winterflags