Saltar al contenido
AldeaCode Logo
Tester Regex / Python Desarrollador 100% local

Probar regex en Python: módulo re, raw strings y el desencaje con JS

El módulo `re` de Python es un motor de regex completo con una pega persistente: olvidar el prefijo `r` convierte la mitad de tus patrones en secuencias de escape de Python. Una vez interiorizado el hábito, la API es directa.

Usa siempre raw strings

Python interpreta los backslashes en literales de string normales: "\n" es un newline, "\t" un tab. La sintaxis regex está llena de backslashes, así que sin el prefijo r estás peleándote con el propio lenguaje.

```py import re

# Mal: \d se queda en nada antes de llegar al motor regex pattern = "\d{3}"

# Bien: el prefijo r le dice a Python que no toque los backslashes pattern = r"\d{3}"

re.findall(r"\d{3}", "Pedido 123 sale en 7 días") # ['123'] ```

Convierte el raw string en tu default para toda regex que escribas. Es un carácter extra y elimina una categoría entera de bugs.

Las cuatro funciones que de verdad usas

re.search busca la primera coincidencia en cualquier parte del string y devuelve un objeto Match o None. Para "¿está dentro?".

re.match solo casa al principio del string. Casi nunca es lo que quieres, pese al nombre.

re.findall devuelve cada coincidencia no solapada como una lista de strings, o lista de tuplas si el patrón tiene grupos. Rápido y útil para extracción.

re.finditer devuelve un iterador de Match con posiciones y grupos. Úsalo cuando te importe dónde aterrizó cada match.

Un ejemplo completo de extracción:

text = "Contacta hello@aldeacode.com o support@aldeacode.com"
emails = re.findall(r"[\w.+-]+@[\w-]+\.[\w.-]+", text)

La regex de Python no es la de JavaScript

La mayoría de testers regex online (incluido el de AldeaCode) hablan en flavor JavaScript. El flavor de Python es parecido pero no idéntico, y las diferencias muerden cuando copias un patrón de uno a otro.

Python soporta grupos con nombre vía (?P...). JavaScript adoptó (?...) en ES2018. Cada uno funciona en su motor, ninguno en el otro.

Python soporta flags inline tipo (?i) al inicio del patrón. JavaScript no.

El lookbehind en Python exige ancho fijo en el motor por defecto. El paquete regex de PyPI levanta esa restricción; el re de la stdlib no.

Prueba en el motor donde vas a desplegar. Los bugs cross-engine no salen hasta que el tráfico de producción toca el camino.

Cuándo re de stdlib se queda corto

Para el 95% de tareas regex re vale. Para el 5% restante existe el paquete regex en PyPI: pip install regex. Es API-compatible con re (mismos nombres de función, mismos argumentos) y añade:

Lookbehind de ancho variable. Clases Unicode reales tipo \p{Greek}. Clases POSIX. Patrones recursivos. Grupos atómicos. Cuantificadores posesivos.

Si te ves peleando con la stdlib por algo de esto, cambia la línea de import a import regex as re y el resto de tu código sigue funcionando. Coste pequeño, capacidad ganada enorme.

Ejemplo completo

python
import re

text = "Contacta hello@aldeacode.com o support@aldeacode.com"

# Cada coincidencia
emails = re.findall(r"[\w.+-]+@[\w-]+\.[\w.-]+", text)
print(emails)
# ['hello@aldeacode.com', 'support@aldeacode.com']

# Iterar con posiciones
for m in re.finditer(r"[\w.+-]+@[\w-]+\.[\w.-]+", text):
    print(m.group(), m.span())

# Compila si reutilizas el patrón
EMAIL = re.compile(r"[\w.+-]+@[\w-]+\.[\w.-]+")
EMAIL.findall(text)

¿Solo necesitas el resultado?

Cuando solo quieres iterar visualmente sobre un patrón con resaltado en vivo antes de pegarlo en tu archivo Python, el tester regex en el navegador te da ese bucle sin setup. Recuerda las diferencias del flavor JS y arregla los escapes específicos de Python al copiar de vuelta.

Abrir Tester de Expresiones Regulares (JavaScript) →

Preguntas frecuentes

¿Conviene siempre re.compile?

Solo si reutilizas el mismo patrón muchas veces en un bucle caliente. Python cachea internamente los patrones recientes, así que un re.findall puntual no es más lento que su versión compilada.

¿Cómo casa a través de saltos de línea?

Pasa re.DOTALL como flag para que . también case newlines, o usa [\s\S] dentro del patrón. El comportamiento por defecto es que . salte los newlines, lo cual sorprende a quien viene de one-liners en PCRE.

¿Por qué mi regex va lenta con entradas largas?

Backtracking catastrófico. Patrones con cuantificadores anidados tipo (a+)+ explotan con ciertas entradas. Usa grupos atómicos o cuantificadores posesivos del paquete regex, o repiensa el patrón con non-greedy y anclas explícitas.