Desktop version

Home arrow Language & Literature

  • Increase font
  • Decrease font


<<   CONTENTS   >>

Expresiones regulares

Como acabamos de ver, grep у muchas otras utilidades que podemos emplear para la recuper- acion de informacion lingiifstica existente en textos utilizan expresiones regulares. Son formulas о patrones que penniten captar у expresar regularidades de las secuencias de caracteres. Su utilidad es inestimable cuando necesitamos recuperar secuencias que tienen rasgos en comun al lado de rasgos diferenciales. El operador de disyuncion puede ser suficiente en el caso de que haya pocas altemativas, pero no resultara de utilidad para, por ejemplo, localizar palabras que comien- cen о terminen por un determinado caracter о secuencia de caracteres, contengan solo mayus- culas, dfgitos, etc. La potencia de las expresiones regulares es enonne, de modo que resultara util entender algunas de sus caracterfsticas basicas у mas utiles para el trabajo que queremos hacer.

Cuando se usan expresiones regulares, el punto (.) es el sustituto de cualquier caracter alfanumerico, incluyendo el espacio en bianco.46 Asf, por ejemplo, podemos obtener en la primera parte del Quijote todas aquellas lfneas en las que existe una palabra precedida por un espacio en bianco, un caracter cualquiera у luego la secuencia aso: grep -E " .aso" Quijotel.txt

Notese que el punto sustituye a cualquier caracter que ocupe una posicion precisa. Por tanto, para recuperar todas las secuencias de cinco letras precedidas у seguidas por un espa- cio en bianco que contengan la secuencia aso en su centro, podemos usar:

grep -E " .aso. " Quijotel.txt

las voces salian. Y, a pocos pasos que entro por el bosque, vio atada una

imitar en todo cuanto a el le parecia posible los pasos que habia leido en

me hara al caso, у quedese lo del vengarme a mi cargo.

[. . .]

La ultima lfnea de las seleccionadas en la muestra anterior deja ver que la expresion “cualquier caracter” incluye tambien signos de puntuacion. Para obtener lfneas que contengan palabras precedidas por un bianco, un caracter cualquiera, la secuencia aso у luego un punto ortografico:

grep -E " .aso.." Quijotel.txt

merced, que me trae a deshoras у por estos no acostumbrados pasos.

el cual hay mucha contratacion de higos pasos. Dos о tres veces hizo este

De gran interes para nuestros propositos habituales es la indicacion de la posible alternan- cia de dos о mas caracteres en posiciones especificadas. El modo de hacerlo es situar esos caracteres entre corchetes. Volviendo sobre alguno de los ejemplos anteriores, podemos emplear esta posibilidad para recuperar los casos de superlativos en masculino о femenino

grep -E "isimfao]" Quijotel.txt

о bien para saber cuantas formas distintas responden a este patron en la lista de las que inte- gran la primera parte del Quijote:

grep -Ec "isim[ao]" lista_Ql_quat.txt 73

Es posible situar entre corchetes no una serie de caracteres, sino todo un rango (lo cual requiere, сото es logico, una cierta ordenacion). Por ejemplo, para ver las diez formas mas frecuentes de la primera parte del Quijote que empiecen рог a о bien por q, r, s о t:

grep -E " [aq-t]" lista_Ql_quat.txt |head 10660 que 4782 a 2369 se 1843 su 943 si 837 al 753 tan

626 sin 610 todo 545 asi

Dado que la utilizacion de rangos se basa inicialmente en los codigos que corresponden a los caracteres, es muy probable que diferentes versiones de grep se comporten de modo distinto en este punto. Por ejemplo, la version que estoy utilizando para escribir este capftulo incluye tanto la fi сото las vocales que llevan tilde en el rango [a-z], сото muestra la salida siguiente:

grep -E " [a-z]" lista_Ql_quat.txt|grep -E " [nao]"

  • 32 animo 22 arboles 11 anima 9 arbol 7 ambar 6 ordenes 6 aspero 5 animos 3 aspera 3 angel 3 al 2 nudos 2 angeles 2 amexi 1 oiganme 1 asperos 1 arbitros 1 arabes 1 ancoras 1 alamo
  • 1 aguila

No es seguro, sin embargo, que todas las versiones de grep para todos los sistemas operati- vos se comporten de este modo. En caso de no ser asi, hay que incluir esos caracteres tarn- bien dentro de los corchetes, сото muestra la orden siguiente:

grep -E " [a-zaon]" lista_Ql_quat.txt|grep -E " [nao]"

La indicacion de rangos debe tener en cuenta la diferencia entre mayusculas у minusculas. Asf la orden

grep -E " [a-z]" lista_Ql_quat.txt | grep -E " A"

no devolvera nada, puesto que la A no esta incluida entre las minusculas. Porsupuesto, es posi- ble hacer referencia a todas, incluidas (en la version que yo manejo) las mayusculas con tilde:

grep -E " [a-zA-Z]" lista_Ql_quat.txt|grep -E " A"

2 Amexi

2 Alvaro 1 Avila 1 Arboles

Es posible tambien indicar caracteres que deseamos excluir en una posicion determinada. Por ejemplo, para obtener una lista de las palabras que empiezan por cualquier letra minus- cula, pero excluyendo las que lo hacen con una d, podrfamos escribir:

grep -E " [a-ce-z]" lista_Ql | grep -E " d"

Otro modo de conseguir esto mismo consiste en dar la expresion en positivo, pero invirtiendo el resultado. Por ejemplo, se da сото condicion que la palabra empiece por A, pero se anade el operador que hace que devuelva las lfneas que no cumplen esa condicion:

grep -Ev " A" lista_Ql_quat.txt | grep " A"

Existe tambien la posibilidad de excluir un caracter (o una serie de caracteres) de una deter- rninada posicion. Por ejemplo, podemos recuperar las palabras que comienzan por la secuen- cia Ab con la orden

grep -E " Ab" lista_Ql_quat.txt

у recuperar aquellas que comienzan рог A у van seguidas de cualquier caracter distinto de b:

grep -E " A[Ab]" lista_Ql_quat.txt | grep -E " Ab"

Por supuesto, es posible excluir mas de un caracter mediante enumeracion о indicacion de rango:

grep -E " A[Abc]" lista_Ql_quat.txt|grep -E " A[be]"

Un operador del mayor interes у que no hemos utilizado hasta ahora es el que centra las busquedas deseadas en lo que podemos considerar una “palabra”. Es dectr, no se trata de localizar la secuencia de caracteres senalada en cualquier posicion, sino conseguir reducirla a aquellos casos en los que constituye una palabra completa. Por ejemplo, el CORDE muestra que Cervantes utiliza la palabra mente en varias de sus obras, pero no aparece en el Quijote. Para comprobar este dato (podrt'a haber algtin error en la edicion de la obra incluida en el CORDE), podemos hacer esa bitsqueda en el texto con el que estamos trabajando, bien sea directamente bien sobre alguna de las listas producidas. Pero, si lo hacemos tal сото hemos venido trabajando hasta ahora, no se diferenciara la palabra mente de la secuencia -mente, muy frecuente en la formacion de adverbios de modo:

grep -Ec "mente" Quijote7.txt Quijotel.txt:348 Quijote2.txt: 410

Si, en cambio, introducimos el operador w:

grep -Ewe "mente" Quijote7.txt

Quij otel.txt:0 Quij ote2.txt: 0

En algunos de los ejemplos anteriores hemos venido utilizando la presencia de un espacio en bianco para buscar algo parecido a la delimitacion de palabra, pero es evidente que esa lfnea tiene el problema de no tomar en consideracion la posible aparicion de un signo de puntuacion inmediatamente antes о despues.

Mediante expresiones regulares es posible tambien hacer referencia al comienzo о al final de una palabra, que es un recurso realmente util cuando se trata de trabajar con prefijos о sufijos. Por ejemplo, si estamos interesados en el sufijo -cion podemos saber que palabras lo llevan en la primera parte del Quijote, cuantas son у cual es la frecuencia de cada una de ellas:

grep -Ec "cion>" lista_Ql_quat.txt

98

Puede pensarse que, dado que la о va tildada, la indicacion de que se trata precisamente del final de palabra es superflua. Sin embargo, la siempre conveniente comprobacion de la hipotesis muestra que no es asi, sino que hay una palabra que contiene -cion en una posicion que no es la del final de palabra:

grep -Ec "cion" lista_Ql_quat.txt

99

De gran interes en las expresiones regulares son los operadores que permiten hacer indi- caciones adicionales sobre el numero de apariciones de un determinado caracter en una cierta posicion. Supongamos que, por alguna extrana razon, estamos interesados en obtener, de una lista de frecuencias lexicas, todas las palabras de cuatro letras que empiezan рог с у terminan por a. Con lo que ya hemos visto no es dificil:

grep -E "" crea_5000.txt 74. cada 124,558 816.46

  • 122. casa 85,064 557.58
  • 312. cosa 36,267 237.72
  • 457. cara 27,756 181.93
  • 556. cuya 23,048 151.07
  • 814. cuba 16,565 108.58
  • 895. cama 15,328 100.47
  • 1235. сора 11,253 73.76
  • 1692. caja 8,550 56.04
  • 1927. cita 7,581 49.69
  • 2508. cena 5,773 37.84
  • 2558. crea 5,669 37.15
  • 2759. cola 5,210 34.15
  • 2972. capa 4,826 31.63
  • 3039. cura 4,727 30.98
  • 3650. caza 3,874 25.39
  • 4959. coca 2,778 18.20

La misma tecnica, usando los puntos сото indicacion de que vale cualquier caracter que ocupe ese lugar, podrfamos recuperar las de tres letras, cinco letras, etc. Evidentemente, es un metodo razonable para una о dos longitudes concretas, pero largo e incomodo cuando lo que nos interesa es simplemente que comience con un caracter у termine en otro. El modo de hacerlo es anadir el operador *, vinculado al metacaracter *, que hemos utilizado en algunas de las biisquedas de los capftulos 4 у 5 у se emplea tambien сото comodfn en algunos sistemas operativos:

grep -Ec "" crea_5000.txt 137

El significado del operador * en las expresiones regulares no coincide exactamente con el que puede tener en otros usos. Su significado exacto es “сего о mas apariciones del caracter inme- diatamente anterior”, de modo que la indicacion ca*n debe ser leida сото “caracter c seguido de сего о mas apariciones del caracter a у luego el caracter n”. Por tanto, devolvera tambien los casos en los que c vaya seguido inmediatamente por n (que tiene cero caracteres a entre с у n:

grep -E "ca*n" crea_5000.txt |grep "cn"

  • 828. tecnica 16,308 106.89
  • 1061. tecnico 13,022 85.35
  • 1156. tecnicas 11,968 78.44
  • 1329. tecnologia 10,620 69.61
  • 1717. tecnicos 8,473 55.53
  • 3393. tecnologias 4,175 27.36
  • 4329. tecnologico 3,217 21.08
  • 4990. tecnologica 2,758 18.07

Veamos ahora сото podemos mejorar algunas de las biisquedas realizadas anteriormente empleando los operadores que hemos analizado en este apartado. Hemos visto que la busqueda de los casos de superlativo sintetico se puede realizar usando la posibilidad de alternancia de а у о:

grep -Ec "isim[ao]" lista_Ql_quat.txt 73

Entre esos setenta у tres casos figuran masculinos, femeninos, singulares, plurales у tambien superlativos que son tambien formaciones en -mente. Por ejemplo:

1 cortesisimamente 1 corridisimo 1 contentisima 1 Congojadisima 1 clarisimo 1 carisimos

Si, por alguna razon, quisieramos excluir las formaciones en -mente podrfamos recurrir a la indicacion de final de palabra “fsim[ao] >”, pero eso eliminarfa tambien los plurales. Ahora bien, dado que el cuantificador * tiene tambien el significado “cero apariciones del caracter inmediatamente anterior”, podemos pedir:

grep -Ec "isim[ao]s*>" lista_Ql_quat.txt 68

Con ella, isim tiene que ir seguido de a о bien de o, luego puede haber una s о nada y, despues, el final de palabra.

El operador de cuantificacion + tiene el significado “una о mas apariciones del caracter inmediatamente anterior”, con lo que es posible recuperar unicamente los plurales:

grep -Ec "isim[ao]s+>" lista_Ql_quat.txt 16

Ciertamente, en este ultimo caso, dado que inmediatamente a continuacion viene la indi- cacion de fin de palabra у no se dan secuencias сото fsimoss, usar el operador о no hacerlo produce el mismo resultado:

grep -Ec "isim[ao]s>" lista_Ql_quat.txt 16

La diferencia entre ambos operadores quedara mas clara con el ejemplo siguiente. En la lista de las cinco mil formas mas frecuentes del CREA hay un cierto numero de formas constitui- das por el caracter c seguido de una vocal (sin tilde ni dieresis) у una n:

grep -Ec "c[aeiou]n" crea_5000.txt 257

Podemos permitir que haya una о mas vocales entre las dos consonantes, con lo que estamos dando entrada a los casos en los que hay diptongos, у el numero de formas se eleva a 371.

grep -Ec "c[aeiou]+n" crea_5000.txt 371

Si en lugar del operador + utilizamos el operador * aparecen algunos casos mas que, por lo que hemos visto antes, son, precisamente, los que contienen la secuencia cn (formada por c, cero vocales у n):47

grep -Ec "c[aeiou]*n" crea_5000.txt 379

El tercer operador de cuantificacion en las expresiones regulares permite establecer rangos en el numero de apariciones de un cierto caracter, con la posibilidad de indicar un numero mfnimo у un numero maximo. Por ejemplo, si quisieramos recuperar las formas del Qui- jote con un mfnimo de dos letras minusculas у un maximo de cuatro podemos utilizar la orden:48

grep -Ew "[a-z]{2,4 }" lista_Ql_quater.txt

Con este operador podemos recuperar, por ejemplo, las fechas referentes a anos que apare- cen en el texto del Quijote. La opcion de pedir que la secuencia contenga unicamente dfgitos no vale, porque trae secuencias numericas de otros tipos:

grep -Ew "[0-9]+" Quijote7.txt Quijotel.txt:de 1604 anos.

Quijote2.txt:signis Ecclesiae, cap. 10, alentando animos marchitos у esplritus

Quijote2.txt:Madrid, a 17 de marzo de 1615.

Quijote2.txtthabeis senalado, 23 dias ha que salimos de nuestro pueblo: contad, Sancho,

Quijote2.txt:veinte de julio de 1614.

Quijote2.txt:сото se espera de vuestro entendimiento. Deste lugar, a 16 de agosto, a las

Es necesario, por tanto, acotar el numero de dfgitos que buscamos mediante la indicacion del numero exacto:49

grep -Ew "[0-9]{4}" Quijote7.txt Quijotel.txt:de 1604 anos.

Quijote2.txt:Madrid, a 17 de marzo de 1615.

Quijote2.txt:veinte de julio de 1614.

Este operador permite tambien indicar simplemente un mfnimo о un maximo de apariciones:

grep -Ew "[a-z]{4,}" Quijote7.txt grep -Ew "[a-z]{,4}" Quijote7.txt

Devolveran las palabras formadas por un mfnimo de cuatro letras minusculas у un maximo de cuatro letras minusculas, respectivamente.

Las expresiones regulares pueden asimismo hacer referenda al comienzo у al final de las lfneas. Como hemos visto repetidamente, las listas de frecuencias del CREA contienen el numero de orden, la forma, la frecuencia total у la frecuencia normalizada. Es decir, hay muchos dfgitos en cada lfnea. Si, por alguna razon, fuese necesario obtener las formas que aparecen en las frecuencias situadas entre la posicion doscientos у la posicion doscientos noventa у nueve, podrfamos conseguirlo del modo siguiente:50

grep -E "л *2[0-9]{2}." crea_1000.txt

Lo que se pide en esta orden es que se localicen los casos en los que a comienzo de la lfnea hay una serie (opcionalmente vacfa) de espacios en bianco, luego un dos у luego exacta- mente otros dos dfgitos.

El final de lfnea se indica mediante el signo $. Si queremos saber cuantas lfneas vacfas se producen en el proceso de sustitucion de los espacios en bianco por retornos de carro en el texto de la primera parte del Quijote, podemos hacerlo pidiendo las secuencias en las que tenemos comienzo de lfnea у final de li'nea sin nada en medio:

grep -Ec "л$" lista_Ql.txt 4504

Existen tambien expresiones que permiten hacer referencia a clases de elementos, сото, рог ejemplo, todos los dfgitos, todos los caracteres alfanumericos, todos los signos de pun- tuacion, todos los caracteres en minuscula, etc. Utilizando el referente a todos los signos de puntuacion es posible simplificar mucho el proceso descrito en el apartado 7.3.3 para elimi- nar los signos de puntuacion de la lista resultante de la primera parte del Quijote. En lugar de tener que escribir un fichero con las ordenes individuals de sed para cada uno de los signos у las comprobaciones necesarias para asegurarnos de que no se nos ha quedado ninguno, es posible hacer algo сото lo siguiente51

sed 's/[[:punct:]]//g' lista_Ql.txt

у guardar el resultado en otro fichero sobre el cual se pueda trabajar del mismo modo que en este capitulo se ha hecho con lista_Ql_ter.txt о lista_Ql_quat.txt.,2

Practices

Localizar la secuencia de la primera parte del Quijote que contiene -cion en una posicion que no sea final de palabra.

En la lista de frecuencias del CREA, localizar las formas que tienen frecuencias com- prendidas entre quinientos у quinientos noventa у nueve.

En una lista de frecuencias del CREA, localizar las formas que tienen frecuencias com- prendidas entre treinta у treinta у nueve.

 
<<   CONTENTS   >>

Related topics