2014-03-05 88 views
1

我的工作,搜索特定用戶的Twitter項目完全匹配的字符串從我的追隨者名單和銳推他們流。下面的代碼工作正常,但是如果字符串出現在單詞的旁邊(例如,如果期望的字符串只是「man」,但他們寫了「manager」,它會被轉推)。我對python仍然很陌生,但是我的預感是正確的,但我的嘗試迄今已證明沒有用處。搜索從列表在Python

if tweet["user"]["screen_name"] in friends: 
     for phrase in list: 
       if phrase in tweet["text"].lower(): 
        print tweet 
        api.retweet(tweet["id"]) 
        return True 

回答

1

如果你想使用正則表達式來做到這一點,尋找的形式\b<string>\b的模式。在你的情況,這將是:

pattern = re.compile(r"\bman\b") 
if re.search(pattern, tweet["text"].lower()): 
    #do your thing 

\b會在正則表達式的一個單詞邊界。所以前綴和後綴與您的模式將只匹配模式。希望能幫助到你。

+0

您應該更改爲'r「\ bman \ b」'。你現在擁有的東西不會滿足你的期望。 – SethMMorton

+0

剛剛更新和re.search。 Thakns – shaktimaan

+0

謝謝!我結束了使用模式= re.compile(r'\ b'+短語+ r'\ b'),它似乎工作。今天發生了一些非常不幸的微博轉推比賽(我正在搜索國會議員的強姦推文,並把葡萄拉進來)。再次感謝!有時請查看@SexualCongress上的應用程序。 – user3381596

2

由於您只想匹配整個單詞,因此讓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) 
+0

這是一個非常好的解決方案,謝謝!對於它的價值,列表不是實際的變量名稱(我只是用它作爲我自己閱讀方便的虛擬變量) – user3381596