我正在尝试使用Python的正则表达式和for循环替换Twitter数据的URL和@username提及。
d = df['text']
for i, e in enumerate(d):
d[i] = re.sub('((www.\.[\s]+)|(https?://[^\s]+))','URL', e)
d[i] = re.sub('@[^\s]+', 'AT_USER', e)
问题是for循环仅适用于第二行正则表达式代码('AT_USER')。我想替换URL和@username提及。我想为每个循环制作两个独立的for循环,但肯定有更有效的方法吗?
答案 0 :(得分:2)
因此,截至目前,您的代码存在问题 -
# vvv
d[i] = re.sub('@[^\s]+', 'AT_USER', e)
您应该传递d[i]
而不是e
。您通过e
这一事实意味着您覆盖第一次替换的结果。改变它,它应该工作。
你正在使用熊猫。是时候放弃循环了。首先,初始化正则表达式替换对的字典 -
p_dict = {r'((www.\.[\s]+)|(https?://[^\s]+))' : 'URL', r'@[^\s]+' : 'AT_USER'}
现在,使用df.replace
开关 -
regex
df['text'] = df['text'].replace(p_dict, regex=True)
这是一个带有一些虚拟数据的小例子 -
s
0 12.2
1 12.5
2 12.6
3 15.1
4 15.3
5 15.0
dtype: object
s[0]
Out[190]: '12.2' # a string
p_dict = {'\d' : '<DIGIT>', '\.' : '<DOT>'}
s.replace(p_dict, regex=True)
0 <DIGIT><DIGIT><DOT><DIGIT>
1 <DIGIT><DIGIT><DOT><DIGIT>
2 <DIGIT><DIGIT><DOT><DIGIT>
3 <DIGIT><DIGIT><DOT><DIGIT>
4 <DIGIT><DIGIT><DOT><DIGIT>
5 <DIGIT><DIGIT><DOT><DIGIT>
dtype: object