[Volver a la web]


Introducción

Las expresiones regulares o regex son caracteres que definen la búsqueda de un patrón en un texto. Cada caracter dentro de una expresión regular tiene un significado especial, y a simple vista puede parecer algo complicado. En este pequeño tutorial intentaremos explicar los regex paso a paso de modo que se puedan comenzar a entender.

En python, si queremos que nos lo lea como regex, tenemos que ponerle una ‘r’ delante. De no hacerlo, python lo leerá de manera distinta.

##  Tab
## \tTab

Para nuestros ejemplos usaremos la extensión compile y finditer de re. Esto nos dará un iterador donde estarán las coincidencian que buscamos.

Supongamos que queremos buscar la cadena de texto 'abc'. Lo haríamos de la siguiente forma:

## <_sre.SRE_Match object; span=(16, 19), match='abc'>

La posición en la que se encuentra nuestro match dentro del texto la indica dentro del span. Si hacemos un slice con esos índices, veremos que encuentra el patrón que le pedimos.

## abc

A la hora de buscar patrones, hay caracteres especiales que tenemos que tener en cuenta. Por ejemplo, si buscamos un punto en realidad le estamos diciendo que busque cualquier carácter distinto de un salto de línea.

## <_sre.SRE_Match object; span=(0, 1), match='T'>
## <_sre.SRE_Match object; span=(1, 2), match='e'>
## <_sre.SRE_Match object; span=(2, 3), match='x'>
## <_sre.SRE_Match object; span=(3, 4), match='t'>
## <_sre.SRE_Match object; span=(4, 5), match='o'>
## <_sre.SRE_Match object; span=(5, 6), match='.'>
## <_sre.SRE_Match object; span=(7, 8), match='U'>
## <_sre.SRE_Match object; span=(8, 9), match='n'>
## <_sre.SRE_Match object; span=(9, 10), match='a'>
## <_sre.SRE_Match object; span=(10, 11), match=' '>
## <_sre.SRE_Match object; span=(11, 12), match='f'>
## <_sre.SRE_Match object; span=(12, 13), match='r'>
## <_sre.SRE_Match object; span=(13, 14), match='a'>
## <_sre.SRE_Match object; span=(14, 15), match='s'>
## <_sre.SRE_Match object; span=(15, 16), match='e'>
## <_sre.SRE_Match object; span=(16, 17), match='.'>

Si lo que queremos buscar es la posición de los puntos debemos usar \.

## <_sre.SRE_Match object; span=(15, 16), match='.'>
## <_sre.SRE_Match object; span=(26, 27), match='.'>

Tipo caracter

Expresión regular Patrón
. Cualquier carácter excepto una nueva línea
\d Número del 0 al 9
\D Cualquier carácter que no sea un número del 0 al 9
\w Carácter de una palabra (a-z, A-Z, 0-9)
\W Cualquier carácter que no sea el de una palabra (a-z, A-Z, 0-9)
\s Espacios en blanco (espacio, tabulación, salto de línea)
\S Cualquier carácter que no sea un espacio en blanco

Como vemos, las expresiones regulares en mayúsculas suelen ser la negación de su versión en minúsculas

Vamos a ver cómo funciona cada uno.

## <_sre.SRE_Match object; span=(6, 7), match='0'>
## <_sre.SRE_Match object; span=(7, 8), match='1'>
## <_sre.SRE_Match object; span=(8, 9), match='2'>
## <_sre.SRE_Match object; span=(16, 17), match='0'>
## <_sre.SRE_Match object; span=(0, 1), match='T'>
## <_sre.SRE_Match object; span=(1, 2), match='e'>
## <_sre.SRE_Match object; span=(2, 3), match='x'>
## <_sre.SRE_Match object; span=(3, 4), match='t'>
## <_sre.SRE_Match object; span=(4, 5), match='o'>
## <_sre.SRE_Match object; span=(5, 6), match=' '>
## <_sre.SRE_Match object; span=(9, 10), match=' '>
## <_sre.SRE_Match object; span=(10, 11), match='t'>
## <_sre.SRE_Match object; span=(11, 12), match='e'>
## <_sre.SRE_Match object; span=(12, 13), match='x'>
## <_sre.SRE_Match object; span=(13, 14), match='t'>
## <_sre.SRE_Match object; span=(14, 15), match='o'>
## <_sre.SRE_Match object; span=(15, 16), match=' '>
## <_sre.SRE_Match object; span=(17, 18), match='.'>
## <_sre.SRE_Match object; span=(1, 2), match='T'>
## <_sre.SRE_Match object; span=(2, 3), match='e'>
## <_sre.SRE_Match object; span=(3, 4), match='x'>
## <_sre.SRE_Match object; span=(4, 5), match='t'>
## <_sre.SRE_Match object; span=(5, 6), match='o'>
## <_sre.SRE_Match object; span=(9, 10), match='t'>
## <_sre.SRE_Match object; span=(10, 11), match='e'>
## <_sre.SRE_Match object; span=(11, 12), match='x'>
## <_sre.SRE_Match object; span=(12, 13), match='t'>
## <_sre.SRE_Match object; span=(13, 14), match='o'>
## <_sre.SRE_Match object; span=(15, 16), match='0'>
## <_sre.SRE_Match object; span=(0, 1), match='\n'>
## <_sre.SRE_Match object; span=(6, 7), match=' '>
## <_sre.SRE_Match object; span=(7, 8), match='%'>
## <_sre.SRE_Match object; span=(8, 9), match='\n'>
## <_sre.SRE_Match object; span=(14, 15), match=' '>
## <_sre.SRE_Match object; span=(16, 17), match='.'>
## <_sre.SRE_Match object; span=(17, 18), match='\n'>
## <_sre.SRE_Match object; span=(0, 1), match='\n'>
## <_sre.SRE_Match object; span=(6, 7), match=' '>
## <_sre.SRE_Match object; span=(10, 11), match='\n'>
## <_sre.SRE_Match object; span=(11, 12), match='\t'>
## <_sre.SRE_Match object; span=(17, 18), match='\n'>
## <_sre.SRE_Match object; span=(18, 19), match=' '>
## <_sre.SRE_Match object; span=(19, 20), match=' '>
## <_sre.SRE_Match object; span=(1, 2), match='T'>
## <_sre.SRE_Match object; span=(2, 3), match='e'>
## <_sre.SRE_Match object; span=(3, 4), match='x'>
## <_sre.SRE_Match object; span=(4, 5), match='t'>
## <_sre.SRE_Match object; span=(5, 6), match='o'>
## <_sre.SRE_Match object; span=(7, 8), match='0'>
## <_sre.SRE_Match object; span=(8, 9), match='1'>
## <_sre.SRE_Match object; span=(9, 10), match='2'>
## <_sre.SRE_Match object; span=(12, 13), match='t'>
## <_sre.SRE_Match object; span=(13, 14), match='e'>
## <_sre.SRE_Match object; span=(14, 15), match='x'>
## <_sre.SRE_Match object; span=(15, 16), match='t'>
## <_sre.SRE_Match object; span=(16, 17), match='o'>
## <_sre.SRE_Match object; span=(20, 21), match='0'>
## <_sre.SRE_Match object; span=(21, 22), match='.'>

Anclas

También tenemos los anchors (anclas), que no buscan un carácter en especial, sino que buscan las posiciones que cumplan cierta condición

Expresión regular Patrón
\b Busca un patrón que comience con un espacio en blanco o un carácter no alfanumérico
\B Cualquier patrón que no comience con un espacio en blanco o un caracter no alfanumérico
^ El inicio de un string
$ El final de un string
## <_sre.SRE_Match object; span=(0, 2), match='Ja'>
## <_sre.SRE_Match object; span=(3, 5), match='Ja'>
## <_sre.SRE_Match object; span=(8, 10), match='Ja'>

Vemos que encuentra los ‘Ja’ que comienzan en el salto de línea o con un espacio en blanco, pero no el que tiene letras delante.

## <_sre.SRE_Match object; span=(5, 7), match='Ja'>
## <_sre.SRE_Match object; span=(0, 4), match='Prim'>
## <_sre.SRE_Match object; span=(24, 27), match='nea'>

Más de tipo caracter

Expresión regular Patrón
[ ] Busca los carácteres incluidos entre corchetes, alguno de ellos, en la posición indicada
[^ ] Busca los caracteres no incluidos entre corchetes para la posición indicada

Si queremos buscar grupos de números podemos hacer ésto. Recordemos que el punto busca cualquier caracter.

## <_sre.SRE_Match object; span=(15, 27), match='615-784-8201'>

Si queremos que pille solo un guión o un punto, podemos usar los corchetes.

## <_sre.SRE_Match object; span=(0, 12), match='615-784-8201'>
## <_sre.SRE_Match object; span=(13, 25), match='902.202.1220'>
## <_sre.SRE_Match object; span=(26, 38), match='100*504*1488'>
## <_sre.SRE_Match object; span=(39, 51), match='100-504-1489'>
## <_sre.SRE_Match object; span=(52, 64), match='200-504-1490'>
## <_sre.SRE_Match object; span=(0, 12), match='600-666-6412'>
## <_sre.SRE_Match object; span=(26, 38), match='100*504*1488'>
## <_sre.SRE_Match object; span=(39, 51), match='100-504-1489'>
## <_sre.SRE_Match object; span=(52, 64), match='200-504-1490'>

Recordemos que si usamos el caret (^) dentro de los corchetes, estamos seleccionando la negación.

## <_sre.SRE_Match object; span=(13, 25), match='800.555.1988'>
## <_sre.SRE_Match object; span=(0, 3), match='rio'>
## <_sre.SRE_Match object; span=(12, 15), match='mio'>

Lógicos y cuantificadores

Expresión regular Patrón
| Signo para unir la búsqueda de patrones. Equivalente a un booleano “o”.
( ) Grupo
* 0 o más
+ 1 o más
? 0 o 1
{3} Exactamente 3
{3,4} Rango. Un mínimo de tres y un máximo de cuatro.
## <_sre.SRE_Match object; span=(15, 27), match='615-784-8201'>
## <_sre.SRE_Match object; span=(110, 122), match='902-202-1220'>
## <_sre.SRE_Match object; span=(0, 3), match='Sr.'>
## <_sre.SRE_Match object; span=(48, 51), match='Sr.'>
## <_sre.SRE_Match object; span=(0, 3), match='Sr.'>
## <_sre.SRE_Match object; span=(11, 13), match='Sr'>
## <_sre.SRE_Match object; span=(34, 36), match='Sr'>
## <_sre.SRE_Match object; span=(48, 51), match='Sr.'>
## <_sre.SRE_Match object; span=(0, 10), match='Sr. Vargas'>
## <_sre.SRE_Match object; span=(11, 23), match='Sr Wonderful'>
## <_sre.SRE_Match object; span=(34, 47), match='Sra. Rushmore'>
## <_sre.SRE_Match object; span=(48, 53), match='Sr. G'>
## <_sre.SRE_Match object; span=(0, 10), match='Sr. Vargas'>
## <_sre.SRE_Match object; span=(11, 23), match='Sr Wonderful'>
## <_sre.SRE_Match object; span=(24, 33), match='Srta Nina'>
## <_sre.SRE_Match object; span=(34, 47), match='Sra. Rushmore'>
## <_sre.SRE_Match object; span=(48, 53), match='Sr. G'>

Más ejemplos

En el siguiente ejemplo intentamos buscar correos.

Comenzamos buscando una letra mayúscula o minúscula con [a-zA-Z], añadimos un + para indicar que busque una o más hasta el siguiente símbolo, que será un ‘@’. Volvemos a poner lo mismo hasta el ‘.com’.

## <_sre.SRE_Match object; span=(1, 25), match='gustavoEVargas@gmail.com'>
## <_sre.SRE_Match object; span=(1, 25), match='gustavoEVargas@gmail.com'>
## <_sre.SRE_Match object; span=(26, 55), match='gustavo.vargas@university.edu'>
## <_sre.SRE_Match object; span=(56, 85), match='gustavo-14-vargas@mi-casa.net'>

Visto lo anterior, podemos ver que la expresión:

[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+

es más general, ya que pillar los guiones y generaliza más extensiones finales en el correo.

## <_sre.SRE_Match object; span=(1, 23), match='https://www.google.com'>
## <_sre.SRE_Match object; span=(24, 54), match='http://gustavovargas.github.io'>
## <_sre.SRE_Match object; span=(55, 74), match='https://youtube.com'>
## https://www.google.com
## http://gustavovargas.github.io
## https://youtube.com
## www.
## None
## None
## google
## gustavovargas
## youtube

Si queremos sustituir toda la dirección url con solo el nombre y extensión, podemos hacerlo con la función sub.

## 
## google.com
## gustavovargas.github.io
## youtube.com

Hasta ahora hemos usado la función ‘finditer’, que nos generaba un objeto sobre el que iterar. También podemos usar la función ‘findall’ que nos devuelve una lista de strings. Pero hemos de tener en cuenta que si hay algún grupo, solo nos devolverá grupos

## Sr
## Sr
## Srta
## Sra
## Sr

También tenemos la función match. Hemos de tener en cuenta que no devuelve un iterador, sino que solo devuelve el primer match siempre que comience con el string

## <_sre.SRE_Match object; span=(0, 4), match='Esto'>
## None

Referencias

Si queréis ver más expresiones regulares, lo podéis hacer en este cheatsheet. Y para cualquier sugerencia o errata que encontréis, me podéis contactar en .

Gracias al tutorial de Corey Schafer en el que se basa este tutorial.