Saltar al contenido principal
¿Cómo encontrar todos los correos electrónicos de un texto, comprobar que un DNI tiene el formato correcto o cambiar todas las fechas de 12/10/2026 a 2026-10-12? Las expresiones regulares (regex) describen patrones de texto con una notación compacta, y casi todos los lenguajes y editores las entienden. Al principio parecen jeroglíficos, pero con una docena de símbolos se resuelve la mayoría de los casos.

Lo que vas a aprender

  • Los caracteres especiales y las clases de caracteres.
  • Los cuantificadores y las anclas.
  • Los grupos, las capturas y las alternativas.
  • La diferencia entre cuantificadores voraces y perezosos.
  • Cómo usarlas en Python con el módulo re.
  • Patrones útiles para validar datos.

Fundamentos

Caracteres

La mayoría de los caracteres se representan a sí mismos: el patrón gato encuentra “gato”. Algunos son especiales: . ^ $ * + ? { } [ ] \ | ( ). Para buscarlos literalmente se escapan con \: \. es un punto.

Clases de caracteres

En Python, \w incluye por defecto letras con tilde y la ñ.

Cuantificadores

Se aplican a lo que tienen justo delante: ab+ es “a” seguida de una o más “b”; (ab)+ es “ab” repetido.

Anclas

Para validar que todo el texto cumple un formato se usa ^…$ (o re.fullmatch). Sin anclas, el patrón se busca en cualquier parte.

Grupos y alternativas

  • ( … ) agrupa y captura lo que coincide, para usarlo después.
  • (?: … ) agrupa sin capturar.
  • (?P<nombre> … ) captura con nombre.
  • a|b es una alternativa: “a” o “b”.
  • \1, \2 se refieren a lo capturado por el grupo 1, 2…

Voraces y perezosos

Por defecto los cuantificadores son voraces: cogen todo lo posible. En <b>uno</b> y <b>dos</b>, el patrón <b>.*</b> coincide con todo, de la primera <b> a la última </b>. Añadiendo ? se vuelven perezosos (lo mínimo posible): <b>.*?</b> coincide con cada etiqueta por separado.

El módulo re de Python

Se escriben los patrones como cadenas crudas r"…", para que Python no interprete las barras invertidas. Opciones útiles: re.IGNORECASE (sin distinguir mayúsculas) y re.MULTILINE.

Ejemplos resueltos

Ejemplo 1 · Extraer números

Ocho dígitos y una letra mayúscula:
La regex solo comprueba el formato. La letra correcta se calcula aparte: es la posición número % 23 en la cadena "TRWAGMYFPDXBNJZSQVHLCKE".
Un patrón que acepte exactamente los correos válidos según el estándar es enorme; para validar en serio, lo práctico es una comprobación sencilla y enviar un correo de confirmación.
Los grupos capturan día, mes y año, y en la sustitución se reordenan.
Nueve dígitos que empiezan por 6, 7, 8 o 9, con espacios opcionales cada tres cifras y prefijo +34 opcional:

Errores frecuentes

  • Olvidar escapar el punto. . es “cualquier carácter”; para un punto literal, \..
  • Validar sin anclas. re.search(r"\d{8}[A-Z]", "abc12345678Zxyz") encuentra coincidencia; usa fullmatch o ^…$.
  • No usar cadenas crudas r"…" en Python: "\b" es un retroceso, no un límite de palabra.
  • Usar .* voraz cuando hay varias coincidencias en la misma línea.
  • Intentar procesar HTML o JSON con regex. Para eso hay analizadores específicos; las regex fallan con estructuras anidadas.

Preguntas frecuentes

Las expresiones regulares (en su forma teórica) describen exactamente los lenguajes que reconoce un autómata finito, como las máquinas de estados. Los motores de regex convierten el patrón en un autómata y lo recorren con el texto. Las regex de los lenguajes modernos añaden extras (referencias hacia atrás) que ya no son “regulares” en sentido estricto.
En los editores de código (buscar y reemplazar), en la terminal (grep, sed), en hojas de cálculo, en bases de datos (REGEXP en SQL), en la validación de formularios web y en el análisis de registros (logs) de servidores.

Temas relacionados

Fundamentos de Python

Cadenas y métodos de texto.

Máquinas de estados

Los autómatas detrás de las regex.

Git

Otra herramienta del día a día.
Última modificación el 12 de octubre de 2026