Элегантный способ получить хэштеги из строки в 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 ответов
С @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'])
отметим, что { } синтаксис для выделения работает только начиная с Python 2.7.
Если вы работаете со старыми версиями, понимание списка каналов ([ ]) вывод  как предложено @Bertrand.
[i[1:] for i in line.split() if i.startswith("#")]
эта версия избавится от любых пустых строк (как я прочитал такие проблемы в комментариях) и строк, которые только "#". Также, как в Бертран Марронкод, лучше превратить это в набор следующим образом (чтобы избежать дубликатов и для O (1) время поиска):
set([i[1:] for i in line.split() if i.startswith("#")])
на findall метод объекты регулярных выражений может получить их все сразу:
>>> import re
>>> s = "this #is a #string with several #hashtags"
>>> pat = re.compile(r"#(\w+)")
>>> pat.findall(s)
['is', 'string', 'hashtags']
>>> 
Я бы сказал
hashtags = [word[1:] for word in input.split() if word[0] == '#']
Edit: это создаст набор без каких-либо дубликатов.
set(hashtags)
другой вариант-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 #
есть некоторые проблемы с Здесь представлены ответы.
- 
{tag.полоса ( " # " ) для тегов в тегах.сплит() если тег.startswith ("#")}
[i[1:] для i в строке.split() if i.startswith ("#")]
 
не работает, если у вас есть хэштег, такой как' #one#two#'
2 re.compile(r"#(\w+)") не будет работать для многих языков unicode (даже с использованием re.UNICODE)
Я видел больше способов извлечения хэштега, но не нашел ответа на все случаи
поэтому я написал небольшой код python для обработки большинства случаев. это работает на меня.
def get_hashtagslist(string):
    ret = []
    s=''
    hashtag = False
    for char in string:
        if char=='#':
            hashtag = True
            if s:
                ret.append(s)
                s=''           
            continue
        # take only the prefix of the hastag in case contain one of this chars (like on:  '#happy,but i..' it will takes only 'happy'  )
        if hashtag and char in [' ','.',',','(',')',':','{','}'] and s:
            ret.append(s)
            s=''
            hashtag=False 
        if hashtag:
            s+=char
    if s:
        ret.append(s)
    return set(ret)