由於您只想匹配整個單詞,因此讓Python執行此操作的最簡單方法是將推文文本分成單詞列表,然後使用in
測試每個單詞的存在。
有一個優化可以使用,因爲位置並不重要:通過從單詞列表構建一個集合,您可以更快地搜索(技術上,O(1)而不是O(n)),因爲快速哈希訪問通過集和類型的字典使用(謝謝你,蒂姆·彼得斯,也作者的Python的禪)。
完整的解決方案是:
if tweet["user"]["screen_name"] in friends:
tweet_words = set(tweet["text"].lower().split())
for phrase in list:
if phrase in tweet_words:
print tweet
api.retweet(tweet["id"])
return True
這不是一個完整的解決方案。真的,你應該照顧一些事情,比如清除主要和尾隨標點符號。你可以編寫一個函數來做到這一點,並用tweet文本作爲參數來調用它,而不是使用.split()
方法調用。
由於它發生,我在Python迭代設計可以完全避免,如果短語是一組也(迭代仍將發生,但位於C的速度,而不是Python的速度)最優化。因此,在下面讓我們假設你有初始化期間執行的代碼
tweet_words = set(l.lower() for l in list)
順便說一句代碼,list
是一個可怕的名字的變量,因爲通過它,你做下其一貫的Python列表類型不可用名稱(雖然你仍然可以通過type([])
等技巧獲得)。也許更好的稱之爲word_list
或其他更有意義的東西,而不是現有的名稱。您將不得不根據您的需求調整此代碼,只是爲了給您提供這個想法。請注意,tweet_words
只需設置一次。
list = ['Python', 'Perl', 'COBOL']
tweets = [
"This vacation just isn't worth the bother",
"Goodness me she's a great Perl programmer",
"This one slides by under the radar",
"I used to program COBOL but I'm all right now",
"A visit to the doctor is not reported"
]
tweet_words = set(w.lower() for w in list)
for tweet in tweets:
if set(tweet.lower().split()) & tweet_words:
print(tweet)
您應該更改爲'r「\ bman \ b」'。你現在擁有的東西不會滿足你的期望。 – SethMMorton
剛剛更新和re.search。 Thakns – shaktimaan
謝謝!我結束了使用模式= re.compile(r'\ b'+短語+ r'\ b'),它似乎工作。今天發生了一些非常不幸的微博轉推比賽(我正在搜索國會議員的強姦推文,並把葡萄拉進來)。再次感謝!有時請查看@SexualCongress上的應用程序。 – user3381596