通过reddit bot的单词列表过滤for循环中的字符串

时间:2017-09-18 17:58:25

标签: python for-loop praw

所以我正在尝试编写一个reddit机器人来查找标题中包含某些单词的文章。这是我到目前为止所做的:

top_posts = page.hot(limit=20)
for post in top_posts:
    title = post.title
    if title.lower() in ['word1',  'word2', 'word3']:
        print(title)

如果我用...替换最后两行

    if 'word1' in title.lower():
        print(title)

然后它会打印出标有word1的标题,但是当我将它放入列表时它不会。我想使用一个列表来匹配同一个单词的不同拼写。我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

你错误地放置了操作数的顺序而你做得不对。

使用any检查列表中是否包含列表中的任何字样:

if any(wd in title.lower() for wd in ['word1',  'word2', 'word3']):
    print(title)

要检查title中是否包含所有字样,请改用all

答案 1 :(得分:2)

title.lower() in ['word1',  'word2', 'word3']

这确切地检查了它的含义:title.lower(),小写title是否在单词列表中。

这适用于title是单个单词的情况,例如:

>>> title = 'Word1'
>>> title.lower() in ['word1', 'word2', 'word3']
True

但是,当title是包含多个单词的实际句子时,这不起作用。 title = 'Word1 foo bar'永远不会成为该单词列表的元素。

因此,您必须检查单词列表中的每个单词是否包含在title字符串中:

>>> title = 'Word1 foo bar'
>>> 'word1' in title.lower()
True
>>> 'word2' in title.lower()
False
>>> 'word3' in title.lower()
False

你可以在一个循环中做到这一点,并在你得到一个积极的结果时突破它:

>>> def titleContainsWords(title, words):
        for word in words:
            if word in title:
                return True
        return False

>>> wordlist = ['word1', 'word2', 'word3']
>>> titleContainsWords(title.lower(), wordlist)
True

这是很常见的事情,将any()函数与生成器表达式结合起来还有一种更短的方法来做同样的事情:

>>> any(word in title.lower() for word in wordlist)
True