Lo que he aprendido: expresiones regulares

Acabo de terminar de leer un libro muy guapo que habla de cómo llegar a convertirse en un maestro y dice que uno de los pasos a dar es escribir lo que has aprendido. Como me parece una idea bestial, de ahora en adelante cuando aprenda algo nuevo lo escribiré aquí aumentando el grado de aleatoriedad de este blog aún más si cabe.

¿Qué es lo que he aprendido esta vez que merezca la pena compartir? Pues me he asomado al maravilloso mundo de las expresiones regulares. Bien, empecemos desde el comienzo: ¿qué es una expresión regular? Básicamente una expresión regular es un patrón, como cuando pones *.txt para localizar todos los archivos con esa extensión, pero en nivel leyenda. Gracias a esta historia puedes extraer datos de un archivo con una única línea de código, sin necesidad del mítico bucle en el que lees línea a línea y comparas y tal.

¿Y cómo son las expresiones regulares? Digamos que son del tipo de \d{5}\s\w+, osease una pila de letra extrañas. Esta en concreto busca una cadena de caracteres que contenga 5 números seguidos de un espacio y seguidos de una ristra de caracteres alfanuméricos. ¿De qué vale esto? Fácil: imagina que tienes un archivo de texto gigantesco y sabes que repartidos alegremente por el archivaco están las referencias y los nombres de unos productos. Que tienes un catálogo, vamos. Y quieres solo esos datos y no te apetece copiar y pegar en otro sitio porque eres friki y no te van las tareas repetitivas. ¿Qué haces? ¡Usas una expresión regular! ¿Y eso cómo lo hago? Me dirás. ¡Pues siguiendo estos cómodos pasos!

Paso 1: Fabricación del patrón

Primero tienes que dar con una expresión que localice solamente lo que tú quieres, así que vas a la chuletilla de las expresiones regulares y te montas la movida. En tu caso, como los números de referencia son cinco dígitos y luego hay un espacio y después está el nombre del producto que puede variar en longitud, piensas:

Los números se buscan con \d y son 5 así que necesito \d{5}. Luego hay un espacio y siempre es solo uno así que \s. Ahora viene el nombre del producto que está formado por letras y que tiene una longitud variable. A veces tiene números. Nunca tiene espacios o caracteres especiales. \w me viene al pelo. Y como no sé cómo de largo es el nombre le plantifico un plus para que vaya pillando caracteres hasta que llegue a uno que no sea alfanumérico. Total, me queda \d{5}\s\w+.

La chuleta

La chuleta la he sacado de aquí

Paso 2: verificación del patrón

Como eres novatillo y te da miedo organizarla (tranquilo, nos pasa a todos) quieres verificar que tu superpatrón coge las cadenas que tú quieres y no otras. Eso puedes comprobarlo online si quieres, por ejemplo en esta página.

Paso 3: implementar esto en alguna parte

Esto puedes hacerlo de muchas maneras diferentes. Yo uso expresiones regulares en Python y en Matlab, para más no me da, pero puedes usarlas en muchos lenguajes de programación y aplicaciones, así que búscate la que más te mole. Por ejemplo, en Matlab habría que hacer algo así:

% Leer todo el archivo como string gigante
texto = fileread(archivo);  

% Extraer referencia y nombre del producto: 
exp = '(?<referencia>\d{5})\s(?<producto>\w+)';
datos = regexp(texto,exp,'names');

% Extraer los datos deseados 
referencias = {datos.referencia};
productos = {datos.producto};

clear texto datos 

Matlab permite además hacer otras cosas molonas, lo podéis investigar en su ayuda. En Python es parecido, he puesto el ejemplo de Matlab porque lo tenía a mano, sin más.

Paso 4: Dominación mundial

Recuerda: un gran poder conlleva una gran responsabilidad.

http://xkcd.com/208/

xkcd  es Dios

Esto es lo que he aprendido esta vez. Cuando aprenda algo nuevo lo compartiré aquí 🙂

Anuncios

6 pensamientos en “Lo que he aprendido: expresiones regulares

  1. ekaitzzarraga

    No puede haber una entrada sobre expresiones regulares sin citar hablar del lenguaje de programación Perl.
    Así que lo haré yo:

    Perl.

    Just that.

    Responder
  2. Pingback: Lo que he aprendido: leer datos de archivos de texto en Matlab | Onda Hostil

  3. dariasteam

    Pues no lo sé de primera mano, pero mi profesor de Procesadores de Lenguajes de la Universidad de La Laguna ayer mismo nos explicó que eran las más potentes de todas. Si no entendí mal, permitían hacer cosas como expandir variables a tiempo real, de forma que en vez de tener 10 expresiones regulares del tipo .*\[hola\].*, .*\[amarillo\].* para casar por ejemplo las cadenas [hola], [amarillo] (y otras 8 más), puedes poner algo similar a *\[VARIABLE\].* y llamar a la regex diciéndole que valor ha de tomar dicha variable en tiempo de ejecución. Me

    Responder
    1. Ondiz Autor de la entrada

      Interesante! Siempre he oído hablar de las expresiones regulares de Perl pero nadie me daba más datos.

      Gracias por pasarte por aquí y comentar!

      PD. Creo que se ha roto el comentario 😦

      Responder
  4. Pingback: Compilación: Matlab | Onda Hostil

¡Opina sin miedo! (Puedes usar Markdown)

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 )

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 )

Google+ photo

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

Conectando a %s