我想創建一個RE對象,如果該字符串至少包含一個列表元素,就匹配它。Regex問題:如何檢查列表中的任何值是否匹配?
例如,如果bad_words["censored","stupid","idiot"]
是列表,則RE將匹配,如果它們中至少有一個存在。
這是我的RE:re.compile("(%s)+" % ("|".join(bad_words)), re.IGNORECASE)
問題是, 'youareanidiot' 不匹配。爲了使它匹配,我需要改變什麼?
我想創建一個RE對象,如果該字符串至少包含一個列表元素,就匹配它。Regex問題:如何檢查列表中的任何值是否匹配?
例如,如果bad_words["censored","stupid","idiot"]
是列表,則RE將匹配,如果它們中至少有一個存在。
這是我的RE:re.compile("(%s)+" % ("|".join(bad_words)), re.IGNORECASE)
問題是, 'youareanidiot' 不匹配。爲了使它匹配,我需要改變什麼?
你在使用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"
儘管可以用正則表達式來做到這一點,但我認爲在這裏沒有正則表達式會更好。要測試字符串s
對bad_words
,嘗試像
s = s.lower()
any(bad in s for bad in bad_words)
你bad_words
都應該是小寫。
任何(),我_always_忘記那一個(和所有()):) – 2011-05-30 14:02:38
我只是做了一些測試 - 看起來像CPython的編譯正則表達式將擊敗「in」查找由明顯的差異,如果被搜索的字符串是超過一定的門檻(對我來說平均爲500字左右)。也看起來像CPython的「in」增加了較長的字符串的複雜性,即使匹配是在開始:) – lunixbochs 2011-05-30 14:07:47
@lunixbochs:有趣 - 尤其是最後一個語句! 「更好」我並不是真正意義上的表現,而是代碼可讀性和避免陷阱。例如。您的代碼不會使用're.escape()'引用正規表達式中使用的'bad_words'項,這可能會在稍後引入難以找到的錯誤。 – 2011-05-30 14:35:10
你的意思是*包含*而不是*包含*? – 2011-05-30 13:57:59