Re en Python (expreciones regulares)
¿Qué es re? {#qué-es-re}
El módulo re (de regular expressions, expresiones regulares) permite buscar, reemplazar y analizar texto mediante patrones.
Se importa con:
import re
FUNCIONES PRINCIPALES {#funciones-principales}
1. re.match(patrón, texto) {#re.matchpatrón-texto}
Busca solo al inicio del texto.
import re
m = re.match(r"Hola", "Hola mundo")
print(m.group()) # Hola
2. re.search(patrón, texto) {#re.searchpatrón-texto}
Busca en cualquier parte del texto (la primera coincidencia).
re.search(r"mundo", "Hola mundo").group() # mundo
3. re.findall(patrón, texto) {#re.findallpatrón-texto}
Devuelve todas las coincidencias en una lista.
re.findall(r"\d+", "Edad 17 años, código 2025") # ['17', '2025']
4. re.finditer(patrón, texto) {#re.finditerpatrón-texto}
Devuelve un iterador con objetos Match (útil para posiciones).
for m in re.finditer(r"\d+", "x=5 y=10 z=20"):
print(m.group(), m.start(), m.end())
5. re.sub(patrón, reemplazo, texto, count=0) {#re.subpatrón-reemplazo-texto-count0}
Reemplaza coincidencias por otro texto.
re.sub(r"\d+", "X", "Tengo 2 perros y 3 gatos") # 'Tengo X perros y X gatos'
6. re.split(patrón, texto, maxsplit=0) {#re.splitpatrón-texto-maxsplit0}
Divide el texto usando el patrón como separador.
re.split(r"\s+", "uno dos tres") # ['uno', 'dos', 'tres']
7. re.compile(patrón, flags=0) {#re.compilepatrón-flags0}
Compila el patrón para reutilizarlo muchas veces (más eficiente).
patron = re.compile(r"\d+")
print(patron.findall("a1b22c333")) # ['1', '22', '333']
OBJETOS Match {#objetos-match}
Cuando haces match() o search(), obtienes un objeto con información útil:
m = re.search(r"(\d+)", "Edad: 25 años")
print(m.group()) # '25'
print(m.start()) # 6
print(m.end()) # 8
print(m.span()) # (6, 8)
Sí hay grupos (entre paréntesis):
m = re.search(r"(\d+)\s*(años)", "Edad: 25 años")
print(m.groups()) # ('25', 'años')
print(m.group(1)) # '25'
print(m.group(2)) # 'años'
METACARACTERES MÁS IMPORTANTES {#metacaracteres-más-importantes}
SECUENCIAS ESPECIALES {#secuencias-especiales}
FLAGS COMUNES {#flags-comunes}
Ejemplo:
patron = re.compile(r"""
^\d{4} # 4 dígitos al inicio
-\d{2} # guion y 2 dígitos
-\d{2}$ # guion y 2 dígitos al final
""", re.VERBOSE)
print(bool(patron.match("2025-10-27"))) # True
EJEMPLOS PRÁCTICOS {#ejemplos-prácticos}
1. Validar un correo electrónico {#validar-un-correo-electrónico}
import re
patron = r"^[\w\.-]+@[\w\.-]+\.\w+$"
print(bool(re.match(patron, "usuario@mail.com"))) # True
2. Extraer números de un texto {#extraer-números-de-un-texto}
re.findall(r"\d+", "ID123, edad 45, año 2025") # ['123', '45', '2025']
3. Reemplazar palabras {#reemplazar-palabras}
texto = "Hola mundo cruel"
nuevo = re.sub(r"cruel", "hermoso", texto)
print(nuevo) # Hola mundo hermoso
4. Separar texto por comas o espacios {#separar-texto-por-comas-o-espacios}
re.split(r"[, ]+", "rojo, verde azul,amarillo") # ['rojo', 'verde', 'azul', 'amarillo']
Buenas prácticas {#buenas-prácticas}
✅ Usa r”./…” (raw strings) para no tener que escapar . ✅ Compila patrones que usarás muchas veces con re.compile(). ✅ Usa re.fullmatch() sí necesitas que toda la cadena coincida. ✅ Usa ? después de * o + para modo no codicioso (lazy).
re.findall(r"", "") # ['', '']
Ejercicio rápido {#ejercicio-rápido}
Extrae todos los nombres de usuario de correos:
import re
texto = "Correos: ana@mail.com, juan123@dominio.org"
print(re.findall(r"(\w+)@", texto)) # ['ana', 'juan123']