在Python中从字符串中获取主题标签的优雅方法?

Dan*_*mov 7 python string list-comprehension hashtag

我正在寻找一种干净的方法来获取一个#以给定字符串开头的单词集(列表,数组,等等).

在C#中,我会写

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

在Python中执行此操作的相对优雅的代码是什么?

编辑

样本输入:"Hey guys! #stackoverflow really #rocks #rocks #announcement"
预期输出:["stackoverflow", "rocks", "announcement"]

utd*_*mir 19

使用@ inspectorG4dget的答案,如果您不需要重复项,则可以使用set comprehensions而不是list comprehensions.

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

请注意,{ }set comprehensions的语法仅适用于Python 2.7.
如果您正在使用旧版本,请按照@Bertrand的建议[ ]将Feed list comprehension()输出设置为set函数.


ins*_*get 15

[i[1:] for i in line.split() if i.startswith("#")]
Run Code Online (Sandbox Code Playgroud)

这个版本将摆脱任何空字符串(因为我已经在评论中阅读了这些问题)和字符串"#".此外,与Bertrand Marron的代码一样,最好将其转换为如下集合(以避免重复和O(1)查找时间):

set([i[1:] for i in line.split() if i.startswith("#")])
Run Code Online (Sandbox Code Playgroud)


bgp*_*ter 8

正则表达式对象findall方法可以一次性获取它们:

>>> import re
>>> s = "this #is a #string with several #hashtags"
>>> pat = re.compile(r"#(\w+)")
>>> pat.findall(s)
['is', 'string', 'hashtags']
>>> 
Run Code Online (Sandbox Code Playgroud)


Ber*_*ron 7

我会说

hashtags = [word[1:] for word in input.split() if word[0] == '#']
Run Code Online (Sandbox Code Playgroud)

编辑:这将创建一个没有任何重复的集合.

set(hashtags)
Run Code Online (Sandbox Code Playgroud)