next up previous index
Siguiente: Ejercicios con expresiones regulares Subir: Fundamentos de Perl (1) Anterior: Ejemplo de estructuras de control   Índice de Materias

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, /patrón/ 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 carácter excepto \n, comodín (wildcard)
/\s/    # es un espacio en blanco (space)
/\t/    # es un tabulador
/\w/    # es un carácter alfanumérico (word), incluyendo '_'
/\W/    # no es un carácter alfanumérico (word)
/\d/    # es un dígito
/\D/    # no es un dígito 

/\A/     # es el principio de una cadena
/\Z/     # es el final de una cadena
/^/      # es el principio de una línea de archivo
/$/      # es el final de una línea de archivo

/\//     # es el carácter / 
/[...]/  # es una clase de carácteres que hay que buscar


Los cuantificadores son:
+ una ó más veces
? cero ó una vez
* cero ó más veces
{n,m} mínimo y máximo de veces  

Los paréntesis se usan:
/(\d\s\w)/   # para agrupar varios símbolos en un sólo patrón
/(A|B|C)/    # para definir un patrón formado por varias alternativas: coincide con 'A', con 'B' o con 'C'

Expresiones más complejas, que memorizan los patrones encontrados:
/(11+)/       # guarda la primera aparición de al menos dos unos seguidos
/(11+)\s+\1/  # guarda la primera aparición 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 (patrón), \2 al segundo y así sucesivamente
              # sus apariciones se almacenan en las variables especiales $1, $2, ...
              # $1, $2, ... son asignadas desde cada patrón agrupado con paréntesis

Veamos unos ejemplos:

if($cadena =~ /\s+/) { # ejecuta este código si hay uno ó más espacios en blanco en $cadena }

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

if($cadena =~ /(\d|\s)/) { # ejecuta este código si encuentra un dígito o un espacio en blanco en $cadena }

if($cadena =~ /[A-Za-z]/) { # ejecuta este código si encuentra cualquier letra, mayúscula o minúscula, 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/patrón/sustitución/[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//;  # patrón es /\s/ y sustitución 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_sustitución/

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
next up previous index
Siguiente: Ejercicios con expresiones regulares Subir: Fundamentos de Perl (1) Anterior: Ejemplo de estructuras de control   Índice de Materias
Bruno Contreras Moreira 2007-06-15