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:
\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")
\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.
# 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
\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{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)
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.