我正在网上抓取并尝试过滤掉其中包含某些字词的句子。假设我有这个句子列表:
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”。有没有办法编写这段代码,以便它不是比较字母而是整个字?
答案 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)]