Explicación de Python Regex (2026)
Regex es la característica más temida de Python. No es tan difícil, pero el 80% de los tutoriales introducen la teoría (\d, \w, codicioso versus perezoso) antes de mostrarte un patrón único que realmente usarías en código real. Este tutorial cambia eso.
Cubriremos: los conceptos básicos del módulo re, los cinco patrones que cubren el 90% del trabajo real, cuando re.compile realmente ayuda, grupos con nombre versus grupos numerados, y los cuatro casos en los que regex es la herramienta INCORRECTA.
El módulo en 60 segundos
Todo vive en el módulo stdlib re. Tres funciones cubren la mayoría de las necesidades:
Regla: utilice re.search en caso de duda. re.match solo verifica el inicio; olvidar eso lleva a "¡mi expresión regular no coincide!" 30 minutos perdidos.
Cuerdas sin procesar: úsalas siempre
El prefijo r"..." deshabilita la interpretación de la barra invertida. Sin él, "\d" se convierte en "\\d" en Python, lo que el motor de expresiones regulares ve como \d; el mismo resultado, pero solo por accidente y solo para \d. "\n" en una expresión regular es una nueva línea, no los dos caracteres ` + n`.
Memoria muscular: cada literal de expresión regular comienza con "r". Sin excepciones.
Los 5 patrones que cubren el 90% del trabajo real
1. Extrae todos los números enteros del texto
Tenga en cuenta que 199.99 se divide en ['199', '99'] — \d+ no cruza el punto. Utilice r"\d+(?:\.\d+)?" para decimales opcionales:
2. Normalizar los espacios en blanco
\s+ coincide con cualquier conjunto de espacios/tabulaciones/nuevas líneas. Reemplazar con un solo espacio, quitar los bordes. Esta es la respuesta de Python a sed -E 's/[[:space:]]+/ /g'.
3. Extraiga el nombre de host de una URL
Los paréntesis crean un grupo de captura; .group(1) devuelve su contenido. [^/:]+ = "uno o más caracteres que no son / o :" — se detiene en el separador de puerto O en la ruta.
Para el análisis de URL de producción, utilice urllib.parse.urlparse (maneja casos extremos como información de usuario + IPv6). Regex es para una extracción rápida y sucia.
4. Validación de correo electrónico suelta
NO existe una expresión regular que valide completamente los correos electrónicos según RFC 5322. Cualquiera que le diga lo contrario está vendiendo algo. Pero este detecta el 99% de las direcciones reales sin rechazar falsamente las buenas:
Los anclajes (^ y $) fuerzan la coincidencia de cadenas completas. Sin ellos, "foo@bar" dentro de una oración más grande coincidiría.
Producción: enviar un correo electrónico de confirmación. Ese es el ÚNICO validador de correo electrónico confiable.
5. Grupos de captura con nombre
Los grupos numerados ((...) + .group(1)) están bien para 2-3 capturas. Más allá de eso, los nombres ganan:
.groupdict() devuelve un dictado de todos los grupos nombrados. Agregue/reordene grupos sin dividir cada sitio de llamada que haga referencia a .group(3).
re.compile — cuando realmente ayuda
Stdlib mantiene una pequeña caché de patrones compilados (tamaño predeterminado 512), por lo que las llamadas únicas a re.search(pattern, text) son efectivamente gratuitas después del primer acceso. re.compile ayuda explícitamente cuando:
1. El patrón se utiliza dentro de un bucle cerrado (millones de coincidencias).
2. Desea almacenar el patrón como una constante a nivel de módulo para la capacidad de grep.
3. Necesita .finditer(), .pattern, .flags en el objeto compilado.
No compiles demasiado. Cada re.compile a nivel de módulo agrega un pequeño costo de tiempo de importación.
Banderas comunes
Combinar con |: re.IGNORECASE | re.MULTILINE.
Cuando regex es la herramienta INCORRECTA
1. Análisis de HTML/XML → utilice un analizador real
La respuesta clásica de Stack Overflow para esto tiene 20 años y sigue siendo cierta.
2. Analizando JSON → use json
El módulo json maneja comillas anidadas, caracteres de escape, Unicode y todos los casos extremos de RFC 8259. JSON de análisis de expresiones regulares es una señal antipatrón.
3. Analizar fechas → use dateutil o datetime.strptime
dateutil.parser.parse("2026-07-30") acepta todos los formatos que un humano pueda escribir. datetime.strptime maneja formatos conocidos de manera eficiente. Ambos manejan zonas horarias. Regex necesitaría reinventarlo todo.
4. Patrones anidados/recursivos → use un generador de analizadores
Las expresiones equilibradas, JSON anidadas y de pares coincidentes están formalmente más allá del poder de las expresiones regulares (territorio de gramática libre de contexto). Utilice pyparsing / lark / ANTLR, o simplemente recorra la cadena con un pequeño analizador.
Depuración de expresiones regulares
Utilice regex101.com (elija la versión "Python"). Pegue el patrón + texto de muestra; resalta coincidencias en tiempo real, explica cada metacarácter y muestra grupos con nombres. La forma más rápida de aprender expresiones regulares de forma intuitiva.
Para la depuración a nivel de código, re.DEBUG imprime la máquina de estado compilada:
Practica
Escribe una expresión regular para cada uno. Soluciones a continuación.
1. Extraiga el número de versión de "Python 3.13.2 (principal, 15 de enero de 2026, 10:32:11)"; debería devolver "3.13.2".
2. Divida "manzana,plátano; naranja cereza" en cualquier delimitador (,, ; o espacio).
3. Vuelva a escribir foo.bar_baz-123 como FOO.BAR_BAZ-123 (solo letras mayúsculas, deje dígitos y puntuación).
Soluciones:
Regex es una superpotencia una vez que superas los primeros 10 patrones. El truco consiste en desarrollar la memoria muscular con los cinco anteriores: cubren el 90% del trabajo real. Busque un analizador real en el momento en que se encuentre escribiendo referencias retrospectivas para equilibrar los pares.
Siguiente paso: lecciones de expresiones regulares + procesamiento de texto en la sección Automatización: practique con archivos de registro, datos CSV y tareas de raspado web con Python real ejecutándose en su navegador.