Expresiones regulares

Las expresiones regulares se usan para analizar el contenido de cadenas de caracteres por medio de patrones. Son muy útiles y por ello deberéis aprender a definir vuestros propios patrones.

Como en otras secciones, os remito a la guía de referencia de Perl para ver todo el repertorio de símbolos y que se pueden usar para construir patrones.

Un patrón está delimitado por dos barras inclinadas, /patron/ y los caracteres que insertéis en él pueden tener un significado literal u otro especial cuando vaya precedido del modificador \. Por ejemplo, /n/ es un patrón que coincidirá con cualquier aparición de un carácter n en una cadena. Sin embargo, /\n/ sólo coincidirá con los caracteres de nueva línea.

Los símbolos más habituales en expresiones regulares podrían ser:

 
/./     # cualquier caracter excepto \n, comodin (wildcard)
/\s/    # es un espacio en blanco (space)
/\t/    # es un tabulador
/\w/    # es un caracter alfanumerico (word), incluyendo '_'
/\W/    # no es un caracter alfanumerico (word)
/\d/    # es un digito
/\D/    # no es un digito 

/\A/     # es el principio de una cadena
/\Z/     # es el final de una cadena
/^/      # es el principio de una linea de archivo
/$/      # es el final de una linea de archivo

/\//     # es el caracter / 
/[...]/  # es una clase de caracteres que hay que buscar
/[ABC]/# para definir un patron formado por varias alternativas: coincide con 'A', con 'B' o con 'C'

Los cuantificadores son:

 
+ una o mas veces
? cero o una vez
* cero o mas veces
{n,m} minimo y maximo de veces

Los paréntesis se usan para agrupar varios símbolos en un sólo patrón y memorizar en variables locales los patrones encontrados:

 
/(\d\s\w)/   

/(11+)/       # guarda la primera aparicion de al menos dos unos seguidos
/(11+)\s+\1/  # guarda la primera aparicion de al menos dos unos seguidos y mira a ver si 
              # hay otra igual separada por al menos un espacio en blanco 
				  
              # \1 corresponde al primer (patron), \2 al segundo y asi sucesivamente
              # sus apariciones se almacenan en las variables especiales $1, $2, ...
              # $1, $2, ... son asignadas desde cada patron agrupado con parentesis

Veamos unos ejemplos:

if($cadena =~ /\s+/) { # ejecuta este codigo si hay uno o mas espacios en blanco en $cadena }

if($cadena =~ /\s{2,}/) { # ejecuta este codigo si hay al menos dos espacios en blanco en $cadena }

if($cadena =~ /[\d\s]/) { # ejecuta este codigo si encuentra un digito o un espacio en blanco en $cadena }

if($cadena =~ /[A-Za-z]/) { # ejecuta este codigo si encuentra cualquier letra, mayuscula o minuscula, en $cadena }

Otra posible forma de uso:

my $cadena = "34 KDa";
$cadena =~ /^(\d\s+KDa)/;  
print "$1\n";                # en caso de encontrar el (patrón) en $cadena, $1 contendrá su primera aparición

El repertorio de aplicaciones de las expresiones regulares se ha merecido que hayan aparecido libros dedicados sólo a ellas, por lo que no pretendo aquí mostraros todo el potencial que tienen. Valga de ejemplo que se han usado incluso para comprobar si un número es primo mediante (1 x $numero) !~ /^(11+)\1+$/ . Pero sí vamos a ver un par de funciones de Perl, las primeras después de print y scalar, que están asociadas a las expresiones regulares y son muy útiles. Ambas usan el operador =~.

La primera es la sustitución (s), cuya sintaxis simplificada es:

$cadena =~ s/patron/sustituto/[g|i]

donde g es un modificador opcional para que sustituya todas las apariciones del patrón, no sólo la primera, y i es un modificador opcional para que letras iguales coincidan aunque estén mayúsculas o minúsculas. Veamos un ejemplo:

 
my $cadena = "Letras y espacios \n";
									
$cadena =~ s/\s//;  # patron es /\s/ y el sustituto es // , ahora $cadena contiene "Letrasy espacios \n";

$cadena =~ s/\s//g; # ahora $cadena contiene "Letrasyespacios\n";

La otra función es la traducción (tr) y su sintaxis es muy similar:

$cadena =~ tr/lista_caracteres/lista_caracteres_sustitucion/

que reemplaza cada aparición de un carácter de la lista de caracteres de la izquierda por el carácter que ocupa la misma posición en la lista de la derecha. Veamos otro ejemplo:

$DNAcomplementario =~ tr/ATGC/TACG/;



Subsecciones
Bruno Contreras-Moreira
http://www.eead.csic.es/compbio