我想查找所有含有#的單詞。 我想:用#查找全部單詞#
import re
text = "I was searching my #source to make a big desk yesterday."
re.findall(r'\b#\w+', text)
,但它不工作...
我想查找所有含有#的單詞。 我想:用#查找全部單詞#
import re
text = "I was searching my #source to make a big desk yesterday."
re.findall(r'\b#\w+', text)
,但它不工作...
您可以使用:
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
返回的,因此需要進行一些後處理甚至更少整齊。
這裏有一個小的正則表達式來做到這一點:
>>> 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']
你不需要正則表達式來解決這個問題:
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']
Nice complete回答! – james
感謝...但它給了我一個空列表作爲輸出 – james
@totyped對不起,需要逃避' #',一秒! –
@totyped立即出發! –