PythonAprende PythonDocumentación

Expresiones regulares

Patrones para buscar y extraer texto con el módulo re.

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 coincidencias
  • search → el primer match en cualquier parte (o None)
  • 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ónCoincide con
\dun dígito (0-9)
\wletra, dígito o guion bajo
\sun 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/sub son 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

Quiz

  1. 1. ¿Cuál es la diferencia entre re.match y re.search?

  2. 2. ¿A qué coincide el patrón r"\d+"?

  3. 3. ¿Qué devuelve re.findall(r"\d+", "a1b22c333")?

Ejercicios

Ejercicio 1: Extraer números

Completa `extraer_numeros(texto)` para que use re.findall con \d+ y devuelva los números encontrados como enteros (¡conviértelos con int!).

Cargando editor…

Ejercicio 2: Validar email simple

Completa `es_email_valido(texto)` usando re.match con un patrón simple: uno o más caracteres alfanuméricos o puntos, seguidos de @, más alfanuméricos, un punto y 2-3 letras. Devuelve True/False.

Cargando editor…