2017-09-18 7 views
0

タイトルに特定の単語を含む記事を探すためにreddit botを作成しようとしています。私がこれまで持っているものここにあります:forループ内の文字列を、reddit botの単語リストでフィルタリングします。

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) 

...と最後の2行を交換する場合、それは私がにそれを置くときにそれらにword1を持っていますが、タイトルを印刷しますそれはリストではありません。私は同じ単語の異なる綴りにマッチするリストを使用したい。私はここで間違って何をしていますか?

+0

'title.lower()'は '[' word1 '、' word2 '、' word3 ']にありません。 –

答えて

3

オペランドの順序が間違って配置されていて、正しく実行していません。

使用anyリスト内の単語の任意のがタイトルに含まれているかどうかを確認するには:

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

言葉の全てtitleに含まれているかどうかを確認するには、代わりにallを使用しています。

+0

あなたは私の救い主モーゼです。ありがとう! – e1v1s

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 
関連する問題