用#查找全部单词#
我想查找所有含有#的单词。 我想:用#查找全部单词#
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'] 以上是 用#查找全部单词# 的全部内容, 来源链接: utcz.com/qa/257387.html

