我想创建一个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