用Python从字符串中优雅地提取哈希标签的方法?

11 投票
6 回答
32884 浏览
提问于 2025-04-16 19:28

我想要一个简单的方法,从一个给定的字符串中提取出以#开头的单词,形成一个集合(可以是列表、数组等等)。

在C#中,我会这样写:

var hashtags = input
    .Split (' ')
    .Where (s => s[0] == '#')
    .Select (s => s.Substring (1))
    .Distinct ();

那么在Python中,有什么比较优雅的写法呢?

编辑

示例输入:"Hey guys! #stackoverflow really #rocks #rocks #announcement"
期望输出:["stackoverflow", "rocks", "announcement"]

6 个回答

10

正则表达式对象的 findall 方法可以一次性找到所有匹配的内容:

>>> import re
>>> s = "this #is a #string with several #hashtags"
>>> pat = re.compile(r"#(\w+)")
>>> pat.findall(s)
['is', 'string', 'hashtags']
>>> 
15
[i[1:] for i in line.split() if i.startswith("#")]
set([i[1:] for i in line.split() if i.startswith("#")])

这个版本会去掉所有空字符串(因为我在评论中看到有人提到这个问题)以及那些只有"#"的字符串。此外,像Bertrand Marron的代码那样,把它变成一个集合会更好(这样可以避免重复,并且查找速度是O(1))。

24

根据@inspectorG4dget的回答,如果你想要去掉重复的内容,可以用集合推导式来代替列表推导式。

>>> tags="Hey guys! #stackoverflow really #rocks #rocks #announcement"
>>> {tag.strip("#") for tag in tags.split() if tag.startswith("#")}
set(['announcement', 'rocks', 'stackoverflow'])

需要注意的是,{ }这种集合推导式的写法从Python 2.7开始才支持。
如果你使用的是较旧的版本,可以先用列表推导式([ ])生成列表,然后再把这个列表传给set函数,正如@Bertrand建议的那样

撰写回答