Ciertamente, no es tan difícil tampoco:
shortword = re.compile(r'\W*\b\w{1,3}\b')
La expresión anterior elija alguna palabra que va precedido de algunos caracteres que no son palabras (esencialmente espacios en blanco o el comienzo), tiene entre 1 y 3 caracteres cortos, y termina en un límite de palabras.
>>> shortword.sub('', anytext)
' echo chamber from Ontario '
Los \b
partidos de contorno son importantes aquí, se aseguran de que no hace coincidir sólo los primeros o últimos 3 caracteres de una palabra.
Al principio, \W*
le permite eliminar tanto la palabra como los caracteres anteriores que no son palabras para que el resto de la frase coincida. Tenga en cuenta que la puntuación se incluye en \W
, use \s
si solo desea eliminar los espacios en blanco anteriores.
Por lo que vale, esta solución de expresión regular conserva espacio en blanco adicional entre el resto de las palabras, mientras que la versión de mgilson colapsa múltiples espacios en blanco en un espacio. No estoy seguro si eso te importa.
Su solución lista por comprensión es el más rápido de los dos:
>>> 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
He añadido 'echo' a su salida esperada, ya que es de 4 caracteres corto. :-) –
@MartijnPieters - También puede cambiar "menos de 3 caracteres" por "menos de 4 caracteres", solo para que la gramática sea correcta y sea consistente. – mgilson
@mgilson: Fui un poco más creativo e hice * 3 caracteres o menos * en su lugar. –