如何使用循环和正则表达式来更改列表的元素

时间:2017-12-14 13:27:46

标签: python regex pandas

我正在尝试使用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循环,但肯定有更有效的方法吗?

1 个答案:

答案 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