[Writer] Encontrar palabras repetidas no contiguas

Si leíste mi libro, ya sabes cómo encontrar palabras repetidas consecutivas utilizando expresiones regulares. Ahora bien, ¿cómo podemos encontrar palabras repetidas no consecutivas en una misma oración?

Prepárate, que cuando entras el peligroso terreno de las expresiones regulares nunca se sabe dónde se va a terminar.

Supongamos que queremos identificar oraciones (¡no párrafos, oraciones individuales!) donde una determinada palabra aparece demasiadas veces. Para fijar ideas, utilicemos un ejemplo ridículo como esos que suelo usar:

Este es un texto donde la palabra un se repite un poco demasiado. Este otro texto tiene solo un poco de un. Esta oración no tiene nada de eso.

¿Este es un texto donde la palabra un se repite un poco demasiado? Este otro texto tiene solo un poco de un. Esta oración no tiene nada de eso. ¡Este es un intruso, un elemento, un algo!

Aquí tenemos una oración donde la palabra «un» aparece tres veces, otra donde aparece dos, una tercera donde no aparece y así siguiendo. Queremos seleccionar las oraciones donde «un» aparezca al menos tres veces. ¡Expresiones regulares al rescate!

Primero, tenemos que introducir la expresión [:punct:] que busca signos de puntuación, que así podremos limitarnos a oraciones dentro de párrafos. Con esto podríamos utilizar la siguiente expresión

([^[:punct:]]*un([^[:punct:]])*){3,}

que busca la secuencia «un número arbitrario de cosas que no son signos de puntuación, la secuencia “un”, otro número arbitrario de cosas que no son un signo de puntuación» repetida tres o más veces. Esta expresión funciona de maravillas… salvo por la última oración, que después de todo las comas también son signos de puntuación. Y ni hablar de si tienes comillas en tu texto.

Bueno, parece que en lugar de utilizar el compacto y elegante [:punct:] tendremos que ir por algo más específico y feo, como esta expresión

([^[\.|¿|¡|\?|\!]]*un([^[\.|\?|\!]])*){3,}

que funciona maravillosamente en todos los casos… salvo cuando la palabra que buscas está «oculta» en una palabra más larga. Por ejemplo, esta expresión localiza también

¡Este es un «intruso», un elemento, una cosa!

si bien tendría que saltársela ya que el tercer «un» en realidad está dentro de «una». Bueno, pongamos entonces el delimitador de palabra \b (mannaggia!)

([^[\.|¿|¡|\?|\!]]*\bun\b([^[\.|\?|\!]])*){3,}

Y ahora sí, ya estamos. Al menos eso creo. A ver, que tal vez si… No, me detengo aquí. Como ves, una tarea que parecía simple se ha ido al demonio rápidamente. La realidad suele ser más complicada de lo que parece a simple vista, especialmente si tienes que utilizar expresiones regulares.

Aquí puedes dejar un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios .