用#查找全部单词#
我想查找所有含有#的单词。 我想:用#查找全部单词#
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