lunes, junio 18, 2007

Practicando Expresiones Regulares con Regex Coach

Las expresiones regulares son una importante herramienta para el manejo de información no estructurada o débilmente estructurada. Más allá de los usos clásicos, relacionados con el análisis léxico en teoría de compiladores, un buen manejo de las expresiones regulares puede dar al programador una significativa ventaja a la hora de escribir código.

Para aquellos que deseen practicar con ER les dejo una herramienta educativa llamada Regex Coach (http://www.weitz.de/regex-coach) la cual permite construir expresiones y verificar su funcionamiento a partir del ingreso de cadenas a procesar. A los efectos de ganar tiempo les dejo a continuación una serie de tips para empezar a entender y probar la técnica:

Caracteres especiales

Por ejemplo copia la siguiente expresión regular "(sulf|clor)(ito|ato)" y comprueba con que cadenas hace match, verás que solo lo hace con 4 términos.

Prueba el operador de repetición "*" (clausura de Klenee) y verifica para la siguiente expresión regular "(sc|g)o*(al|re)" cuales términos son válidos.

"ac*a" una a seguida por cualquier cantidad de c y al final otra a

Si se quiere operar con rangos de caracteres se deben utilizar los metacaracteres "[rango]", por ejemplo [0-9] solo dígitos numéricos [a-z] letras minúsculas entre a la z, [^0-9] ^es operador de negación, es decir que no sean dígitos numéricos.

Por ejemplo, una expresión regular que detecta si un término empeiza con letra mayúscula y continua con minúsculas "[A-Z][a-z]*". O un número de 3 dígitos "[0-9]{3} " o de 3 o más [0-9]{3,}

Cualquier cadena no vacía que contenga a, x e y "[axy]+"

Si queremos detectar si una cadena a su inicio empieza con una subcadena utilizamos "^Su color" o al final de la cadena "trono$".

Ahora es el momento de ver a pleno la potencia de las ER, el siguiente programa Perl lee el archivo de texto "aba.txt" de una sola vez, reemplaza los caracteres de fin de línea por espacios, normaliza a minúsculas todas las letras, elimina aquellos caracteres que no estén en el rango de la a y la z, extrae las palabras y finalmente muestra su frecuencia. casi todo hecho con expresiones regulares y en poquísimas líneas.

open(IN,"aba.txt");

@tmp=; $texto = "@tmp";
$texto =~ s/\n/ /g;
$texto =~ tr/A-Z/z-z/;
$texto =~ s/[^a-z]/ /g;
(@arreglo)=split(/ /,$texto);
foreach $ele (@arreglo) {$aso{$ele}=$aso{$ele}+1}
foreach $ele (keys %aso) { print $ele." = ".$aso{$ele}."\n" }

No hay comentarios.: