Una expresión regular (regex) es un mini-lenguaje para describir patrones de texto: "dígitos seguidos", "un email", "una fecha con guiones". El módulo re de Python las ejecuta.
Tu primer patrón
import re
texto = "Pedí 3 cafés y pagué 12500 pesos"
print(re.findall(r"\d+", texto)) # ['3', '12500'] → todos los números
print(re.search(r"\d+", texto)) # primer match, con posición
print(re.match(r"\d+", texto)) # solo si coincide DESDE el inicio (None aquí)
findall→ lista con todas las coincidenciassearch→ el primer match en cualquier parte (oNone)match→ solo valida desde el inicio del texto
El prefijo r (raw string) es obligatorio en patrones: le dice a Python "no interpretes los backslashes".
Los bloques de construcción
| Patrón | Coincide con |
|---|---|
\d | un dígito (0-9) |
\w | letra, dígito o guion bajo |
\s | un espacio en blanco |
. | cualquier carácter |
+ | uno o más (del símbolo anterior) |
* | cero o más |
? | opcional (cero o uno) |
{2,4} | entre 2 y 4 repeticiones |
[aeiou] | cualquier vocal |
[^0-9] | lo que NO sea dígito |
^ / $ | inicio / fin del texto |
| ` | ` |
Ejemplos combinando:
r"\d{3}-\d{4}" # 555-1234 (teléfono)
r"\d{1,2}/\d{1,2}/\d{4}" # 4/9/2026 (fecha corta)
r"colombia|peru" # uno de los dos países
Grupos: extraer piezas
Los paréntesis capturan partes del match:
registro = re.search(r"(\d{4})-(\d{2})-(\d{2})", "vence el 2026-09-04")
print(registro.group(0)) # 2026-09-04 (todo el match)
print(registro.group(1)) # 2026 (año)
print(registro.group(2)) # 09 (mes)
Con múltiples resultados: re.findall(r"(\w+)@(\w+\.com)", texto) devuelve tuplas por cada email.
Sustituir y validar
# sub: reemplazar patrón
limpio = re.sub(r"\s+", " ", "texto con espacios") # colapsar espacios
# validar un formato completo
def es_celular(texto):
return re.match(r"^3\d{9}$", texto) is not None
print(es_celular("3001234567")) # True
print(es_celular("300123")) # None → False
Para validar "todo el string", ancla con ^...$ y usa match — o re.fullmatch.
El error clásico: regex para todo
Las regex son poderosas y adictivas. Cuando el patrón se vuelve inlegible (emails "reales", HTML, fechas con zonas horarias), baja de nivel: divide en pasos o usa un parser/librería específica. Regex para búsquedas simples y extracción; no para parsear estructuras completas.
Resumen
re.findall/search/match/subson las cuatro herramientas diarias\d+,\w+,\s+ cuantificadores+ * ? {}cubren el 80% de los casos- Siempre escribe patrones con raw strings:
r"..." - Los grupos
(...)extraen piezas del match - Si la regex se vuelve incomprensible, busca otra estrategia