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

时间:2011-06-13 14:04:55

标签: python string list-comprehension hashtag

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

在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"]

5 个答案:

答案 0 :(得分:19)

使用@inspectorG4dget's answer,如果您不想重复,可以使用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'])

请注意,set comprehensions的{ }语法仅适用于Python 2.7 如果您使用的是旧版本,则Feed列表理解([ ])输出到set的功能为suggested by @Bertrand

答案 1 :(得分:15)

[i[1:] for i in line.split() if i.startswith("#")]

此版本将删除任何空字符串(因为我已在评论中阅读此类问题)和仅"#"的字符串。此外,与Bertrand Marron的代码一样,最好将其转换为如下所示的集合(以避免重复和O(1)查找时间):

set([i[1:] for i in line.split() if i.startswith("#")])

答案 2 :(得分:8)

regular expression objectsfindall方法可以立即获取所有内容:

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

答案 3 :(得分:7)

我会说

hashtags = [word[1:] for word in input.split() if word[0] == '#']

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

set(hashtags)

答案 4 :(得分:1)

另一个选择是regEx:

import re

inputLine = "Hey guys! #stackoverflow really #rocks #rocks #announcement"

re.findall(r'(?i)\#\w+', inputLine) # will includes #
re.findall(r'(?i)(?<=\#)\w+', inputLine) # will not include #