我正在寻找一种干净的方法来获取在给定字符串中以#
开头的单词集(列表,数组等)。
在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"]
答案 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 objects的findall
方法可以立即获取所有内容:
>>> 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 #