2011-05-30 65 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

相关问题