用Python从字符串中优雅地提取哈希标签的方法?
我想要一个简单的方法,从一个给定的字符串中提取出以#
开头的单词,形成一个集合(可以是列表、数组等等)。
在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建议的那样。