Regex para fechas

Patrones para encontrar fechas en un texto, con grupos de captura listos para usar. La idea importante va primero: el regex reconoce la forma; tu biblioteca de fechas valida el calendario. Un regex que «sabe» que febrero tiene 28 días es un regex que nadie puede leer.

🎙️ Publicado y grabado:

🎧 Escuchar esta guía

Fechas ISO: 2026-07-22 (el formato bueno)

\b\d{4}-\d{2}-\d{2}\b

# con grupos de captura: año, mes y día se devuelven por separado:
(\d{4})-(\d{2})-(\d{2})

# Python
m = re.search(r"(\d{4})-(\d{2})-(\d{2})", text)
year, month, day = m.groups()      # ("2026", "07", "22")

Fechas con barras: 22/07/2026 o 07/22/2026

\b\d{1,2}/\d{1,2}/\d{4}\b          # formas DD/MM y MM/DD

# ⚠ el regex NO PUEDE saber cuál de las dos es. 04/07/2026 es
# el 4 de julio en Boston y el 7 de abril en Londres. solo el contexto
# (o la especificación de los datos) lo aclara. ningún patrón resuelve la ambigüedad.

Extraer marcas de tiempo de logs

# línea de log clásica:  2026-07-22 14:30:07,123 ERROR ...
(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})

# buscar todos los errores de ayer en un log:
grep -E "^2026-07-21 .*ERROR" app.log

# solo la hora (24 h):
\b([01]?\d|2[0-3]):[0-5]\d\b        # 9:05, 14:30; rechaza 25:99

Nombres de meses: Jul 22, 2026

\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]* \d{1,2},? \d{4}\b

# coincide con "Jul 22, 2026", "July 22 2026", "Dec 3, 1999"
Dónde debe parar el regex
\d{2} para el mes acepta tranquilamente desde 13 hasta 99. Puedes codificar los meses reales con (0[1-9]|1[0-2]) y los días reales con (0[1-9]|[12]\d|3[01]), pero seguiría aceptando el 30 de febrero. El reparto sensato del trabajo es este: el regex encuentra candidatos y el parser de fechas los valida. datetime.strptime(s, "%Y-%m-%d") lanza un error con el 30 de febrero; tu regex no necesita aprenderse el calendario.
# el patrón buscar-y-después-parsear (Python):
for m in re.finditer(r"\b\d{4}-\d{2}-\d{2}\b", text):
    try:
        d = datetime.strptime(m.group(), "%Y-%m-%d")
    except ValueError:
        continue            # tiene forma de fecha, pero no lo es (2026-13-45)
La opinión sincera
Si procesas datos estructurados y conocidos (una API o un CSV con una especificación), no uses regex: strptime o Date.parse con el formato declarado son más estrictos y más claros. Regex se gana el sitio cuando las fechas están escondidas en texto no estructurado: logs, correos o páginas extraídas.
📚 Esta es una página de nuestra serie sobre regex. Los cinco conceptos, la trampa codiciosa y cuándo conviene no usar regex, con audio: Regex en 10 minutos →