Извлечение хэштегов из каждой строки в списке строк в Python - PullRequest
0 голосов
/ 27 апреля 2018

Питон нуб здесь. (полное раскрытие)

У меня есть список твитов, который отформатирован как список строк, например:

["This is a string that needs processing #ugh #yikes",
"this string doesn't have hashtags",
"this is another one #hooray"]

Я пытаюсь написать функцию, которая создаст список хэштегов в каждой строке, но оставит пустые записи, когда нет записей. Это потому, что я хочу присоединиться к этому списку с самими твитами позже. Это мой желаемый вывод:

['#ugh', '#yikes'], [], ['#hooray']

Эта функция, которую я нашел здесь отлично работает для ОДНОЙ строки.

 mystring = "I love #stackoverflow because #people are very #helpful!"

Но, похоже, он не работает для нескольких строк. Это мой код:

 l = len(mystringlist)
 it = iter(mystringlist)

 taglist = []

 def extract_tags(it,l):
      for item in mystringlist:
         output = list([re.sub(r"(\W+)$", "", j) for j in list([i for i in 
         item.split() if i.startswith("#")])])
    taglist.append(output)

 multioutput = extract_tags(mystringlist,l)

 print(multioutput)

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Это может считаться нечитаемым или избыточным для выполняемой задачи, но избегает использования регулярных выражений и поэтому должно быть несколько быстрее:

>>> def hashtags(tweet):
....    return list(filter(lambda token: token.startswith('#'), tweet.split()))

>>> [hashtags(tweet) for tweet in tweets]
[['#ugh', '#yikes'], [], ['#hooray']]
0 голосов
/ 27 апреля 2018

Вы можете использовать регулярное выражение и re.findall.

#\w+ будет соответствовать хэштегу, за которым следует любой символ слова, что эквивалентно [a-zA-Z0-9_]

x = ["This is a string that needs processing #ugh #yikes",
"this string doesn't have hashtags",
"this is another one #hooray"]

import re

hashtags = [re.findall('#\w+', i) for i in x]
print(hashtags)

Выход:

[['#ugh', '#yikes'], [], ['#hooray']]

Если регулярное выражение не совпадает с чем-либо, будет возвращен пустой список, как ожидается в желаемом выводе.

Если есть вероятность, что ваш текст содержит urls, что-то вроде www.mysite.com/#/dashboard, вы можете использовать:

[\s^](#\w+)

Чтобы убедиться, что хештег найден после пробела или в начале строки.

...