miércoles, 15 de julio de 2015

Expresiones regulares en Python

Primero principios básicos:
Anclas.
Donde se encuentra lo que queremos encontrar.
  • ^patron, coincidencia con cadenas que comiencen con "patron"
  • patron$, coincidencia con cadenas que terminen con "patron"
  • ^patron$, la cadena exacta es "patron"
Expresión regular.
Una expresión regular, a menudo llamada también regex, es una secuencia de caracteres que forma un patrón de búsqueda, principalmente utilizada para la búsqueda de patrones de cadenas de caracteres u operaciones de sustituciones. 

Clase de caracteres.
El dominio de posibilidades que puede llegar a ser cierto carácter.
  • [abc] el carácter puede ser a ó b ó c
  • [123ac] el carácter puede ser  1 ó 2 ó 3 ó a ó c
  • ciudadan[oa]s puede ser ciudadanos o ciudadanas la cadena que se busca obtener.
  • [a-z] puede ser cualquier carácter de la a a la z.
  • [0-9] puede ser cualquier número del 0-9
  • [b5-] puede ser un guion b o 5, si se quiere usar un guion, este va al principio o al final nunca intermedio para evitar confusiones.
  • [^dbz] puede ser cualquier carácter que no sea ni d ni b ni z.
Cuantificadores.
  • ?: 0 o una vez.
  • +: una o mas veces.
  • *: cero o mas ocurrencias.
  • {x}: número exacto de ocurrencias que indique x siendo x una variable entera.
  • {x,y}: al menos x y no más de y ocurrencias siendo x e y variables enteras.
Código.
En Python el manejo de expresiones regulares es bastante simple, y bastante útil, es una herramienta imprescindible si deseas hacer una aplicación con una alta funcionalidad y código eficiente.
Pondré este ejemplo:
Validar si las cadenas que entren cumplen con las siguientes características:
  • 5 caracteres
  • El primer carácter es el símbolo "#"
  • El resto son números del 0-9
  • Ejemplo #12345

import re #Modulo de Python para expresiones regulares.
import os

patron=re.compile('[#][0-9]{4}') #Declaracion de patron y almacenamiento en la variable patron
prueba='#123a' #Primera prueba
if patron.findall(prueba)==[prueba]:
 print "Es correcto"
else:
 print "Fallo"

prueba='#1234'#Segunda prueba
if patron.findall(prueba)==[prueba]:
 print "Es correcto"
else:
 print "Fallo"

Aquí tendremos como resultado de la ejecución:

Vamos por partes:
El resultado del findall siempre sera una lista con los resultados encontrados, lo que se trata de encontrar es que toda la variable sea un mismo resultado, eso significa que toda la cadena es parte de la expresión que declaramos.
La primera comparación nos dará como resultado Fallo, esto debido a que solo se cumple la expresión regular hasta el "3" y entonces el resultado que retornara el findall seria ['#123'] cuando lo que se pide es que sea igual a la variable que entro para comparar, a la cadena original.
En la segunda comparación dio como resultado "Es correcto" por que el findall dio como resultado ['#1234'] que es igual a la cadena que mandamos a comparar y por lo tanto es True o "Es correcto".

Este es un tema complejo, te recomiendo practica y que no dudes en escribirme tus dudas, recuerda que pueden ser dudas que muchas otras personas tengan.
De igual manera si deseas más tutoriales de este tema solo pídelos en comentarios. Gracias.


Fuentes y lecturas recomendadas:
https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular consultada el 15 de julio del 2015.
http://www.maestrosdelweb.com/guia-python-expresiones-regulares/ consultada el 15 de julio del 2015.
https://docs.python.org/2/library/re.html?highlight=re#module-re consultada el 15 de julio del 2015.

Muy en especial checate esta pagina, te puedes encontrar muchas herramientas para tus programas.

No hay comentarios:

Publicar un comentario