如何检查列表中的单词是否包含在另一个列表中的句子中?

时间:2016-03-13 21:50:10

标签: python string list set

我正在网上抓取并尝试过滤掉其中包含某些字词的句子。假设我有这个句子列表:

z = ['a privacy policy', 'there are many standard challenges that face every business']

我想过滤掉包含此列表中任何字词的句子:

junk_terms = ['privacy policy', 'cookie policy', 'copyright']

所以我这样做:

for sentence in z:
    if all(term not in sentence for term in junk_terms):
        print sentence

打印出there are many standard challenges that face every business

到目前为止一切顺利。但是,我注意到它没有将junk_terms中的术语与z中的整个术语相匹配。它正在寻找j中是否出现junk_terms中的任何字母。例如,让我们将junk_terms中的“隐私政策”一词改为“privac”

junk_terms = ['privac', 'cookie policy', 'copyright']

我希望它不会过滤掉z中的任何句子。但是,如果你运行它,你会发现它仍然过滤掉了“隐私政策”中的句子,因为它包含字母“privac”。有没有办法编写这段代码,以便它不是比较字母而是整个字?

2 个答案:

答案 0 :(得分:1)

re可能就是您正在寻找的东西。结果是所有未经过滤的字符串。这样,您还可以捕获包含以点或逗号结尾的垃圾表达式的字符串。

import re
import itertools
# All of the strings
z = ['a privacy policy', 'there are many standard challenges that face every business']
junk_terms = ['privacy policy', 'cookie policy', 'copyright']

# Build the regex, making sure we don't capture parts.
regex = re.compile("|".join(r"\b{}\b".format(term) for term in junk_terms))

# Filter out anything that we found junk in.
result = list(itertools.filterfalse(regex.search, z))

关于re的说明:\b表示单词边界并且在单词之间匹配,而|表示OR。基本上\bfoo\b|\bbar\b会将包含foo的任何字符串作为单词匹配,或bar作为单词匹配,因为我们filterfalse(),它们将被删除。

<强>更新

对于python 2,正确的函数是ifilterfalse()而不是filterfalse()

答案 1 :(得分:0)

我认为您的代码按照预期的方式运行。你也可以用列表理解来编写它:

print [sentence for sentence in z if not any(term in sentence for term in junk_terms)]