2017-12-14 16 views
-2

Ich versuche URLs und @username Erwähnungen von twitter Daten zu ersetzen, indem ich regulären Ausdruck von Python und eine for-Schleife benutze.Wie for for loop und regex verwenden, um Elemente einer Liste zu ändern

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) 

Das Problem ist, dass die für die Schleife nur für die zweite Zeile des regulären Ausdruck Code funktioniert (‚AT_USER‘). Ich möchte die URL UND @ username Erwähnungen ersetzen. Ich dachte daran, zwei getrennte Schleifen für jeden zu machen, aber sicherlich gibt es einen effektiveren Weg?

+0

'd [i] = re ('@ [^ \ s] +', 'AT_USER', e)' => 'd [i] = re ('@ [^ \ s] +', 'AT_USER', d [i]) 'oder deine erste Zeile hat keine Wirkung –

+0

Warum benutzt du Pand? wie und nicht mit 'str.replace'? –

Antwort

2

Also, das Problem mit Ihrem Code wie jetzt von hier ist -

#         vvv 
d[i] = re.sub('@[^\s]+', 'AT_USER', e) 

Sie sollten d[i] statt e werden vorbei. Die Tatsache, dass Sie e übergeben, bedeutet, dass Sie überschreiben das Ergebnis des ersten Ersatzes. Ändern Sie es, und es sollte funktionieren.


Sie verwenden Pandas. Es ist Zeit, die Schleife abzubrechen. Zuerst initialisieren ein Wörterbuch der Regex-Ersetzen-Paare -

p_dict = {r'((www.\.[\s]+)|(https?://[^\s]+))' : 'URL', r'@[^\s]+' : 'AT_USER'} 

Nun passieren dies df.replace mit dem regex Schalter -

df['text'] = df['text'].replace(p_dict, regex=True) 

Hier ist ein kleines Beispiel mit einigen Dummy-Daten -

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 
+1

Hey, hör auf, mit deinem Repräsentantenhut zu prahlen :) Du hättest den Fehler erklären können, den das OP an erster Stelle hatte (siehe meinen Kommentar) –

+0

@ Jean-FrançoisFabre Oh, ich verstehe was du meinst. ;-) Klar, wird updaten! –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Gute Arbeit, danke, dass Sie nicht nur meinen Fehler erklären, sondern auch eine Antwort geben. –