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
I 'echo' auf Ihre erwartete Ausgabe hinzugefügt haben, da es 4 Zeichen kurz ist. :-) –
@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
@mgilson: Ich war ein bisschen kreativer und machte es * 3 Zeichen oder weniger * stattdessen. –