我正在尝试迭代列表,测试条件,并且当条件满足时,将匹配的值附加到新的空白列表。第一次满足条件时,匹配的值应该附加到新的列表@index 0.第二次,索引1,等等。问题是,它被附加到包含它的同一索引的新列表中在我正在迭代的原始列表中。如果有人知道如何解决这个问题,我将非常感激!
for i in range(len(tweets)): #contains list of dictionaries
if tweets[i].get('text') is not None:
string = tweets[i].get('text')
tweet_text.append(re.findall(r"#(\w+)", string))
打印tweet_text显示以下内容:
[[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [u'easybranches', u'SEO', u'marketing', u'influence', u'social', u'leadership', u'brand', u'branding'], []]
答案 0 :(得分:1)
re.findall
总会返回一些东西。如果找不到匹配项,则返回空列表。每次正则表达式不匹配时,您都会附加一个空列表。
如果您只想在找到匹配项时附加,则需要在 条件下进行测试:
for tweet in tweets: #contains list of dictionaries
text = tweet.get('text')
if text is not None:
matches = re.findall(r"#(\w+)", text)
# Test whether any matches were found
if matches:
tweet_text.append(matches)
您还可以使用get
的空字符串默认值来折叠这两个条件:
for tweet in tweets: #contains list of dictionaries
matches = re.findall(r"#(\w+)", tweet.get('text', ''))
if matches:
tweet_text.append(matches)
如果没有文字,使用get('text', '')
会返回一个空字符串;然后findall
将始终有效,如果没有找到匹配则返回一个空列表。
我也改变了你的循环。无需迭代索引;直接在tweets
。