2012-09-27 14 views
15

Ist es möglich Regex zu verwenden, um kleine Wörter in einem Text zu entfernen? Zum Beispiel habe ich die folgende Zeichenfolge (Text):Entfernen Sie kleine Wörter mit Python

anytext = " in the echo chamber from Ontario duo " 

Ich möchte alle Wörter entfernen, die 3 Zeichen oder weniger ist. Das Ergebnis sollte sein:

"echo chamber from Ontario" 

ist möglich, es zu tun, dass die Verwendung regulärer Ausdrücke oder andere Python-Funktion?

Danke.

+1

I 'echo' auf Ihre erwartete Ausgabe hinzugefügt haben, da es 4 Zeichen kurz ist. :-) –

+1

@MartijnPieters - Sie können auch "weniger als 3 Zeichen" in "weniger als 4 Zeichen" ändern - nur so ist die Grammatik korrekt und es ist alles konsistent. – mgilson

+2

@mgilson: Ich war ein bisschen kreativer und machte es * 3 Zeichen oder weniger * stattdessen. –

Antwort

26

Sicher, es ist nicht so schwer, entweder:

shortword = re.compile(r'\W*\b\w{1,3}\b') 

Der obige Ausdruck jedes Wort auswählt, wird von einigen Nicht-Wort-Zeichen (im Wesentlichen Leerzeichen oder der Start) vorangestellt, ist zwischen 1 und 3 Zeichen kurz und endet an einer Wortgrenze.

>>> shortword.sub('', anytext) 
' echo chamber from Ontario ' 

Die \b Grenze Spiele nicht wichtig sind, gewährleisten sie, dass Sie nicht nur die eines Wortes ersten oder letzten 3 Zeichen passen.

Die \W* am Anfang können Sie sowohl das Wort entfernen und das vorhergehende Nicht-Wort-Zeichen, so dass der Rest des Satzes noch Testspiele. Beachten Sie, dass Interpunktion in \W enthalten ist, verwenden Sie \s, wenn Sie nur löschen möchten, die vorhergehenden Leerzeichen.

Für das, was es wert ist, behält diese reguläre Ausdrucklösung zusätzlichen Leerzeichen zwischen dem Rest der Wörter bei, während die mgilson-Version mehrere Leerzeichen in einem Leerzeichen zusammenfasst. Nicht sicher, ob dir das wichtig ist.

Seine Liste Verständnis Lösung ist die schnellere der beiden:

>>> import timeit 
>>> def re_remove(text): return shortword.sub('', text) 
... 
>>> def lc_remove(text): return ' '.join(word for word in text.split() if len(word)>3) 
... 
>>> timeit.timeit('remove(" in the echo chamber from Ontario duo ")', 'from __main__ import re_remove as remove') 
7.0774190425872803 
>>> timeit.timeit('remove(" in the echo chamber from Ontario duo ")', 'from __main__ import lc_remove as remove') 
6.4250049591064453 
+2

Vor allem, da die erste Zeile in der OP war: "Ist es möglich zu verwenden *** Regex *** zu entfernen ..." +1 für Gerechtigkeit – jedwards

+0

@jedwards - Horray für Gerechtigkeit! – mgilson

+0

Diese Lösung hat auch sehr gut funktioniert. Die beiden Lösungen sind perfekt geeignet. Danke – Thomas

41

Ich glaube nicht, dass Sie einen regulären Ausdruck für dieses einfache Beispiel brauchen sowieso ...

' '.join(word for word in anytext.split() if len(word)>3) 
+0

Einfach perfekt! Danke – Thomas

+0

Hmmm ... Ich denke, das ist meine beste Chance, das populistische Abzeichen bis jetzt zu bekommen :) – mgilson

+0

+1 upvoting so können Sie Ihre Populist bekommen. – hughdbrown

Verwandte Themen