2012-09-27 14 views
15

¿Es posible usar expresiones regulares para eliminar palabras pequeñas en un texto? Por ejemplo, tengo la siguiente cadena (texto):Eliminar palabras pequeñas con Python

anytext = " in the echo chamber from Ontario duo " 

Me gustaría eliminar todas las palabras de 3 caracteres o menos. El resultado debería ser:

"echo chamber from Ontario" 

¿Es posible hacerlo utilizando la expresión regular o cualquier otra función de python?

Gracias.

+1

He añadido 'echo' a su salida esperada, ya que es de 4 caracteres corto. :-) –

+1

@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

+2

@mgilson: Fui un poco más creativo e hice * 3 caracteres o menos * en su lugar. –

Respuesta

26

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

Especialmente porque la primera línea en el PO era: "¿Es posible usar *** regex *** para eliminar ...?" +1 por justicia – jedwards

+0

@jedwards - ¡Horror por la justicia! – mgilson

+0

Esta solución funcionó muy bien también. Ambas soluciones se adaptaron perfecto. Gracias – Thomas

41

No creo que necesita una expresión regular para este ejemplo simple de todos modos ...

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

¡Simplemente perfecto! Gracias – Thomas

+0

Hmmm ... Creo que esta es mi mejor oportunidad de obtener la insignia populista hasta el momento :) – mgilson

+0

+1 upvoting para que pueda obtener su Populist. – hughdbrown

Cuestiones relacionadas