1. Code
  2. Python

Expresiones regulares en Python

¿Alguna vez te has preguntado cuál es la clave para encontrar algún texto en un documento, o asegurarte de que un texto se ajusta a algún formato, como una dirección de correo electrónico, por ejemplo, y otras operaciones similares?
Scroll to top

Spanish (Español) translation by Andrea Jiménez (you can also view the original English article)

¿Alguna vez te has preguntado cuál es la clave para encontrar algún texto en un documento, o asegurarte de que un texto se ajusta a algún formato, como una dirección de correo electrónico, por ejemplo, y otras operaciones similares?

La clave de estas operaciones son las expresiones regulares (regex). Veamos algunas definiciones de expresiones regulares. En Wikipedia, regex se define de la siguiente manera:

Una secuencia de caracteres que definen un patrón de búsqueda, principalmente para su uso en la coincidencia de patrones con cadenas, o coincidencia de cadenas, es decir, operaciones similares a "buscar y reemplazar". El concepto surgió en la década de 1950, cuando el matemático estadounidense Stephen Kleene formalizó la descripción de un lenguaje regular y se volvió de uso común con las utilidades de procesamiento de texto de Unix ed, un editor, y grep, un filtro.

Otra buena definición de regular-expressions.info es:

Una expresión regular (regex o regexp para abreviar) es una cadena de texto especial para describir un patrón de búsqueda. Puedes pensar en las expresiones regulares como comodines con esteroides. Probablemente estés familiarizado con las notaciones comodín como *.txt para buscar todos los archivos de texto en un administrador de archivos. El equivalente de regex es .*\.txt$

Sé que el concepto de expresiones regulares aún puede sonar un poco ambiguo. Entonces, veamos algunos ejemplos de expresiones regulares para comprender mejor el concepto.

Ejemplos de expresiones regulares

En esta sección, te mostraré algunos ejemplos de regex para ayudarte a entender mejor el concepto.

Di que tenías este regex:

1
/abder/

Esto simplemente nos dice que hagamos coincidir solo la palabra abder.

¿Qué pasa con esta expresión regular?

1
/a[nr]t/

Puedes leer este regex de la siguiente manera: encontrar un patrón de texto de tal manera que la primera letra sea a y la última sea t, y entre esas letras aparezca n o r. Entonces las palabras coincidentes son ant y art.

Déjame darte un pequeño cuestionario en este punto. ¿Cómo escribirías una expresión regular que comience con ca y termine con uno o todos los siguientes caracteres tbr? Sí, esta expresión regular se puede escribir de la siguiente manera:

1
/ca[tbr]/

Si ves una expresión regular que comienza con un acento circunflejo ^, esto significa que debes coincidir con la cadena que comienza con la cadena mencionada después de ^. Por lo tanto, si tenías la regex a continuación, está haciendo coincidir la cadena que comienza con This.

1
/^This/

Por lo tanto, en la siguiente cadena:

1
My name is Abder
2
This is Abder
3
This is Tom

De acuerdo con el regex /^This/, coincidirán las siguientes cadenas:

1
This is Abder
2
This is Tom

¿Y si quisiéramos hacer coincidir una cadena que termina con alguna cadena? En este caso, usamos el signo de dólar $. Este es un ejemplo:

1
Abder$

Por lo tanto, en la cadena anterior (las tres líneas), los siguientes patrones se emparejarían usando esta expresión regular:

1
My name is Abder
2
This is Abder

Bueno, ¿qué opinas de esta expresión regular?

1
^[A-Z][a-z]

Sé que puede parecer complejo a primera vista, pero veámoslo parte por parte.

Ya vimos lo que es un acento circunflejo ^. Significa que coincide con una cadena que comienza con alguna cadena. [A-Z] se refiere a las letras mayúsculas. Entonces, si leemos esta parte de la expresión regular: ^[A-Z], nos está diciendo que hagamos coincidir la cadena que comienza con una letra mayúscula. La última parte, [a-z], significa que después de encontrar una cadena que comience con una letra mayúscula, irá seguida de letras minúsculas.

Entonces, ¿cuál de las siguientes cadenas coincidirá con esta expresión regular? Si no estás seguro, puedes usar Python como veremos en la siguiente sección para examinar tu respuesta.

1
abder
2
Abder
3
ABDER
4
ABder

Las expresiones regulares son un tema muy amplio, y esos ejemplos son sólo para darte una idea de lo que son y por qué las usamos.

Una buena referencia para obtener más información sobre las expresiones regulares y ver más ejemplos es RexEgg.

Expresiones regulares en Python

Pasemos ahora a la parte divertida. Queremos ver cómo trabajar con algunas de las expresiones regulares anteriores en Python. El módulo que usaremos para trabajar con expresiones regulares en Python es el módulo re.

El primer ejemplo fue sobre cómo encontrar la palabra abder. En Python, haríamos esto de la siguiente manera:

1
import re
2
text = 'My name is Abder'
3
match_pattern = re.match(r'Abder', text)
4
print match_pattern

Si ejecutas el script de Python anterior, obtendrás el resultado: ¡None!

El script funciona muy bien, pero el problema es cómo funciona la función match(). Si volvemos a la documentación del módulo re, esto es lo que hace la función match():

Si cero o más caracteres al principio de la cadena coinciden con el patrón de expresión regular, devuelve un objeto de coincidencia correspondiente. Devuelve None si la cadena no coincide con el patrón; ten en cuenta que esto es diferente de una coincidencia de longitud cero.

Ajá, a partir de esto podemos ver que match() devolverá un resultado solo si encuentra una coincidencia al principio de la cadena.

En su lugar, podemos utilizar la función search(), que se basa en la documentación:

Explora la cadena en busca de la primera ubicación donde el patrón de expresión regular produce una coincidencia y devuelva un objeto de coincidencia correspondiente. Devuelve None si ninguna posición de la cadena coincide con el patrón; ten en cuenta que esto es diferente a encontrar una coincidencia de longitud cero en algún punto de la cadena.

Por lo tanto, si escribimos el script anterior, pero con search() en lugar de match(), obtenemos la siguiente salida:

<_sre.SRE_Match object at 0x101cfc988>

Es decir, se ha devuelto un match object.

Si queremos devolver el resultado (coincidencia de cadena), usamos la función group(). Si queremos ver toda la coincidencia, usamos group(0). Así:

print match_pattern.group(0)

devolverá la salida: Abder.

Si tomamos la segunda expresión regular de la sección anterior, es decir /a[nr]t/, se puede escribir en Python de la siguiente manera:

1
import re
2
text = 'This is a black ant'
3
match_pattern = re.search(r'a[nr]t', text)
4
print match_pattern.group(0)

La salida de este script es: ant.

Conclusión

El artículo es cada vez más largo y el tema de las expresiones regulares en Python seguramente requiere más de un artículo, o un libro por sí solo.

Sin embargo, este artículo es para darte un inicio rápido y confianza para ingresar al mundo de las expresiones regulares en Python. Puedes consultar la documentación re para obtener más información sobre este módulo y cómo profundizar en el tema.