Con la tecnología de Blogger.

Multimedia Updates

Video

Ads

Uso Básico de expresiones regulares Python [Django]


En este artículo aprenderemos el uso de los aspectos básicos referente a las expresiones regulares en Python. 

Aplicación:

Al buscar direcciones de correo electrónico, números de teléfono, validar campos de entrada o encontrar por ejemplo una letra mayúscula seguida de dos minúsculas y de 5 dígitos entre 1 y 3, es necesario recurrir a las Expresiones Regulares, también conocidas como Patrones.

Patrones

Con expresiones regulares se puede buscar una subcadena al principio o al final del texto, si se quiere que se repita cierta cantidad de veces, que algo no aparezca o si debe aparecer una subcadena entre varias posibles. Permite además capturar aquellos trozos del texto que coincidan con la expresión, para guardarlos en una variable o reemplazarlos por una cadena predeterminada (o incluso una cadena formada por los mismos trozos capturados). Este artículo tratará sobre algunos aspectos básicos de las expresiones regulares, sin entrar en detalles.

Metacaracteres

Se conoce como metacaracteres a aquellos caracteres que, dependiendo del contexto, tienen un significado especial para las expresiones regulares, y que por lo tanto se debe escapar (colocándoles una contrabarra \ delante) si se quiere buscarlos explícitamente. A continuación se verá los más importantes:
#Anclas: Indican si lo que queremos encontrar se encuentra al principio o al final de la cadena. Combinándolas, podemos buscar algo que represente exactamente a la cadena entera:
^patron: coincide con cualquier cadena que comience con patron.
patron$: coincide con cualquier cadena que termine con patron.
^patron$: coincide con la cadena exacta patron.
#Clases de caracteres: Se utilizan cuando se quiere buscar un caracter dentro de varias posibles opciones. Una clase se delimita entre corchetes (paréntesis rectos) y lista posibles opciones para el caracter que representa:
[abc]: coincide con a, b, o c
[387ab]: coincide con 3, 8, 7, a o b
niñ[oa]s: coincide con niños o niñas.
Si se desea crear una clase de caracteres que contenga un corchete, se escribe \ delante, para que el motor de expresiones regulares lo considere un caracter normal, por ejemplo, la clase [ab\[] coincide con a, b y [.

Rangos

Un rango es una clase de caracteres abreviada que se crea escribiendo el primer caracter del rango, un guión, y el último caracter del rango. Se pueden definir múltiples rangos en una misma clase de caracteres.
[a-c]: equivale a [abc]
[0-9]: equivale a [0123456789]
[a-d5-8]: equivale a [abcd578]
Es importante notar que si se quiere buscar un guión, debe colocarse al principio o al final de la clase.
# [a4-]
# [-a4]
# [a\-4]
También se puede listar caracteres que no deben aparecer. Para lograrlo, se debe negar la clase, colocando un circunflejo inmediatamente después del corchete izquierdo:
[^abc]: coincide con cualquier caracter distinto de a, b y c

Clases predefinidas

Existen formas abreviadas para las clases mas frecuentes. Algunas de estas clases son:
\d : equivale a [0-9]
\s : caracteres de espacio en blanco (espacio, tabulador, nueva línea, etc)
\w : letras minúsculas, mayúsculas, números e infraguión.
"." : coincide con cualquier caracter, sea letra, número o especial.

Cuantificadores

Son caracteres que multiplican el patrón que les precede. Mientras que antes se podía buscar un dígito, o una letra, con los cuantificadores se puede buscar cero o más letras, o entre tres y cinco letras mayúsculas.
Los cuantificadores son:
?: coincide con cero o una ocurrencia del patrón (hace que el patrón sea opcional)
+: coincide con una o más ocurrencias del patrón
*: coincide con cero o más ocurrencias del patrón.
{x}: coincide con exactamente x ocurrencias del patrón
{x, y}: coincide con al menos x y no más de y ocurrencias. Si se omite x, el mínimo es cero, y si se omite y, no hay máximo. Esto permite especificar a los otros como casos particulares: ? es {0,1}, + es {1,} y * es {,} .
Algunos ejemplos:
* : cualquier cadena, de cualquier largo (incluyendo una cadena vacía)
[a-z]{3,6}: entre 3 y 6 letras minúsculas
\d{4,}: al menos 4 dígitos
*hola!?: una cadena cualquiera, seguida de hola, y terminando (o no) con un !
Existen otros metacaracteres en el lenguaje de las expresiones regulares:
?: puede modificar el comportamiento de otro. Por ejemplo, dado bbbbb, b+ coincide con la cadena entera, mientras que b+? coincide solamente con b (la menor cadena que cumple el patrón).
(): agrupan patrones. Sirven para que aquel trozo de la cadena que coincida con el patrón sea capturado, o para delimitar el alcance de un cuantificador. Ejemplo: ab+ coincide con ab, abb, abbb, ..., mientras que (ab)+ coincide con ab, abab, ababab...
| : permite definir opciones para el patrón: perro|gato coincide con perro y con gato.

Módulo re

Python provee el módulo re, podemos crear objetos de tipo patrón y generar objetos tipo matcher, que son los que contienen la información de la coincidencia del patrón en la cadena.
$ import re

$ patron = re.compile('d[1-5]+')

Buscar el patrón en la cadena

Python provee los métodos search y match. La diferencia entre ambos es que, mientras search busca en la cadena alguna ocurrencia del patrón, match devuelve None si la ocurrencia no se da al principio de la cadena:
$ cadena = 'd1324522'

$ patron.match(cadena)
<_sre.SRE_Match object at 0x7f2aa153f168>
$ patron.search(cadena)
<_sre.SRE_Match object at 0x7f2aa153f1d0>
$ cadena = 'md1324522'
$ patron.search(cadena)
<_sre.SRE_Match object at 0x7f2aa153f168>
$ print patron.match(cadena)
None
Si se sabe que se obtendrá más de una coincidencia, se puede usar método findall, que recorre la cadena y devuelve una lista de coincidencias:
$ patron.findall('d541 d141m232')

['d541', 'd141']

Objetos matcher

Cuando se obtiene una coincidencia del patrón en una cadena, cada grupo delimitado por paréntesis captura el texto que haya coincidido con él. Estos grupos son accesibles a través de un objeto tipo matcher devuelto por search o match. Los grupos se enumeran de izquierda a derecha según su orden de aparición en el patrón, y podemos usar este número para acceder al contenido del grupo con el método group del objeto matcher.

$ patron = re.compile('([de])([1-4]+)')

$ matcher = patron.search('d111 d222e333')
$ matcher.group(0)
'd111'
$ matcher.group(1)
'd'
$ matcher.group(2)
'111'
$ matcher.groups()
('d', '111')
Los objetos matcher también guardan la posición en la que la cadena se encontró:
$ matcher.pos

0
Tener en cuenta que el método findall no devuelve objetos tipo matcher, sino que proporciona los grupos de forma similar, como una lista de tuplas:
$ patron.findall('d111 d222e333')

[('d', '111'), ('d', '222'), ('e', '333')]

Reemplazo de cadenas

Existe el método "sub", cuya función es encontrar todas las coincidencias de un patrón y sustituirlas por una cadena. El método recibe dos parámetros: el primero es la cadena con la que se sustituirá el patrón y el segundo es la cadena sobre la que queremos aplicar la sustitución.
$ patron.sub("M", 'd111 d222e333')

'M MM'

Grupos con nombre

Para hacer más cómodo el manejo de patrones complejos y hacerlo más legible, se puede usar grupos con nombre.
Los nombres de grupo se definen agregando ?P al paréntesis de apertura del grupo.
$ patron = re.compile('(?P[de])(?P[1-4]+)')

$ matcher = patron.search('d111 d222e333')
$ matcher.group('letra')
'd'
$ matcher.group('digito')
'111'
Se puede usar el método groupdict para obtener un diccionario de pares nombre-contenido de cada grupo:
$ matcher.groupdict()

{'letra': 'd', 'digito': '111'}

Modificadores para el patrón

Se puede modificar el comportamiento del patrón. Los modificadores más usados son:
re.I o re.IGNORECASE: que el patrón no distinga entre minúsculas y mayúsculas.
re.M o re.MULTILINE: modifica el comportamiento de ^ y $ para que coincidan con el comienzo y final de cada línea de la cadena, en vez de coincidir con el comienzo y final de la cadena entera.
re.S o re.DOTALL: hace que el punto (.) coincida además con un salto de línea (antes coincide con cualquier caracter excepto un salto de línea)
Se puede unir los efectos de más de un modificador separándolos con |. Por ejemplo:
$ patron = re.compile('devcode', re.IGNORECASE | re.M)
Nota
Para mayor información y extensión del tema, visita la documentación oficial en: https://docs.python.org/2/library/re.html#module-contents
Compartir en Google Plus

Autor: Unknown

Colombiano, emprendedor y muy autodidacta, comencé en el fabuloso mundo de la programación hace 3 años, actualmente estoy en 5° semestre de Ingeniería de Sistemas, me gusta el deporte y compartir mi conocimiento .
    Blogger Comment
    Facebook Comment

0 comentarios:

Publicar un comentario