2017-12-02 84 views
-2

我想查找所有含有#的單詞。 我想:用#查找全部單詞#

import re 
text = "I was searching my #source to make a big desk yesterday." 
re.findall(r'\b#\w+', text) 

,但它不工作...

回答

1

您可以使用:

re.findall(r"#.+?\b", text) 

這給:

['#source'] 

這裏是一個鏈接到regex101哪個gi深入瞭解每個部分的功能。


基本上所發生的事情是:

  • #手段捕捉'#'字符字面
  • 那麼我們說,以配合一個.
  • 任何字符,但+意味着捕捉其中一個或多個其中
  • 然後?開頭的非貪婪匹配任何如下
  • \b是一個字邊界,並表示何時停止查找

更新

正如@AnthonySottile指出,有上述regex將失敗的情況,即:

hello#fred 

其中匹配是不應該的。

爲了解決這個問題,一個/s可能被添加到regex的前面,以確保#自帶一些空白後,卻失敗在包括hashtag來就在字符串的開始的情況下。 A /b也不足以作爲#使得標籤不被視爲單詞。

因此,要解決這些,我想出了做findall之前添加到字符串的開頭一個空間的這個相當醜陋的解決方案:

re.findall(r"\s(#.+?)\b", " " + text) 

這不是很整齊,我知道但是真的沒有另一種方式。我嘗試在開始時使用OR來匹配空格或字符串的開頭,如(^|\s),但是這會在列表中產生多個組(作爲元組),這些組是從re.findall返回的,因此需要進行一些後處理甚至更​​少整齊。

+0

感謝...但它給了我一個空列表作爲輸出 – james

+0

@totyped對不起,需要逃避' #',一秒! –

+0

@totyped立即出發! –

2

這裏有一個小的正則表達式來做到這一點:

>>> import re 
>>> s = "I was searching my #source to make a big desk yesterday." 
>>> re.findall(r"#(\w+)", s) 
['source'] 

如果要包括主題標籤,然後使用:

>>> re.findall(r"#.\w+", s) 
['#source'] 
1

你不需要正則表達式來解決這個問題:

text = "I was searching my #source to make a big desk yesterday." 
final_text = [i for i in text.split() if i.startswith('#')] 
輸入: 輸出:

然而,此正則表達式將工作:

import re 
text = "I was searching my #source to make a big desk yesterday." 
final_text = filter(lambda x:x, re.findall('(?<=^)|(?<=\s)#\w+(?=\s)|(?=$)', text)) 

輸出:

['#source'] 
+0

Nice complete回答! – james