从Python中的字符串列表中的每个字符串中提取主题标签

时间:2018-04-27 03:27:35

标签: python arrays list pandas data-cleaning

Python noob在这里。 (完全披露)

我有一个格式为字符串列表的推文列表,如下所示:

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

我正在尝试编写一个函数,该函数将在每行中创建一个主题标签列表,但在没有任何条目时会留下空白条目。这是因为我想稍后将这个列表与推文结合起来。这是我想要的输出:

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

我发现here这个函数适用于一个字符串。

 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 :(得分:1)

您可以使用正则表达式和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+)

确保在空格后或行的开头找到主题标签。

答案 1 :(得分:1)

对于手头的任务,这可能被认为是不可读的或过度的,但是避免使用正则表达式,因此应该更快一些:

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

>>> [hashtags(tweet) for tweet in tweets]
[['#ugh', '#yikes'], [], ['#hooray']]