2012-11-12 56 views
0

我有這樣的文本塊:從字符串中刪除帶有#或@前綴的單詞嗎?

Hello @Simon, I had a great day today. #StackOverflow 

我希望找到最完美的解決方案,以剝離下來到這個樣子:

Hello, I had a great day today. 

即我想去掉所有的話具有#和@的前綴。 (是的,即時通訊檢查鳴叫)

我是新來的python,我可以這樣做在單個單詞上,但不能確定在包含多個單詞的字符串上實現此目的的最佳方法。

我的第一個想法是使用替換,但這隻會刪除實際的@和#符號。 正在尋找剝離任何具有#或@前綴的單詞的最佳方法。

-EDIT- 不知道這是否使答案給予無效,但對於接受,我還需要去掉多個單詞包含前綴#或$的位置。例如你好#hiya #ello

回答

4

您可以使用regular expressions

>>> import re 
>>> s = 'Hello @Simon, I had a great day today. #StackOverflow' 
>>> re.sub(r'(?:^|\s)[@#].*?(?=[,;:.!?]|\s|$)', r'', s) 
'Hello, I had a great day today.' 
+0

如果在這個詞的中間出現「@」或「#」,這會失敗嗎? –

+0

@MarkRansom改進,使它不。 – phihag

+0

雖然這適用於我上面的示例,但似乎並沒有捕捉到所有內容。例如如果兩個哈希標記以空格相互跟隨。見http://pastebin.com/hMWj1d9w – Simon

1

這就像寫一個匿名函數,並把它在一個篩選語句

' '.join(filter(lambda x: x[0] not in ['@','#'], tweet.split())) 

這將失去@users或#topics逗號一樣簡單,但如果你只是處理推特你可能不會錯過它。

+1

這會將多個空間合併爲一個不幸的副作用。取決於應用程序,這可能並不重要。 –

+1

Twitter反正吃空間 – user1552512

0
' '.join([w for w in s.split() if len(w)>1 and w[0] not in ['@','#']]) 

哪裏s是你的鳴叫。

+0

'split()'能夠返回一個零長度的字符串嗎? –

+0

不,'''.split()== []'。 – phihag

+0

糟糕。我確實添加了一些不必要的檢查。我的錯。 –