用#查找全部单词#

我想查找所有含有#的单词。 我想:用#查找全部单词#

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

回到顶部