2011-05-30 66 views
1

我想創建一個RE對象,如果該字符串至少包含一個列表元素,就匹配它。Regex問題:如何檢查列表中的任何值是否匹配?

例如,如果bad_words["censored","stupid","idiot"]是列表,則RE將匹配,如果它們中至少有一個存在。

這是我的RE:re.compile("(%s)+" % ("|".join(bad_words)), re.IGNORECASE)

問題是, 'youareanidiot' 不匹配。爲了使它匹配,我需要改變什麼?

+1

你的意思是*包含*而不是*包含*? – 2011-05-30 13:57:59

回答

4

你在使用re.match嗎?嘗試re.search。請參閱Python正則表達式文檔中的Matching vs. Searching

import re 
bad_words = ["stupid", "idiot"] 
regex = re.compile("|".join(re.escape(word) for word in bad_words), re.IGNORECASE) 
print regex.search('youareanidiot').group() 

# prints "idiot" 
11

儘管可以用正則表達式來做到這一點,但我認爲在這裏沒有正則表達式會更好。要測試字符串sbad_words,嘗試像

s = s.lower() 
any(bad in s for bad in bad_words) 

bad_words都應該是小寫。

+0

任何(),我_always_忘記那一個(和所有()):) – 2011-05-30 14:02:38

+0

我只是做了一些測試 - 看起來像CPython的編譯正則表達式將擊敗「in」查找由明顯的差異,如果被搜索的字符串是超過一定的門檻(對我來說平均爲500字左右)。也看起來像CPython的「in」增加了較長的字符串的複雜性,即使匹配是在開始:) – lunixbochs 2011-05-30 14:07:47

+1

@lunixbochs:有趣 - 尤其是最後一個語句! 「更好」我並不是真正意義上的表現,而是代碼可讀性和避免陷阱。例如。您的代碼不會使用're.escape()'引用正規表達式中使用的'bad_words'項,這可能會在稍後引入難以找到的錯誤。 – 2011-05-30 14:35:10

相關問題