Expresiones Regulares en Python con el módulo re
Las expresiones regulares (regex) permiten buscar, validar y transformar texto con patrones. El módulo re de Python ofrece búsqueda, sustitución, extracción y división de cadenas.
Funciones Básicas del módulo re
import re
texto = "Contacta con soporte@empresa.com o admin@ejemplo.es para más info."
# re.search — Primera coincidencia (en cualquier parte)
m = re.search(r'\b[\w.-]+@[\w.-]+\.\w{2,}\b', texto)
if m:
print(f"Email encontrado: {m.group()}") # soporte@empresa.com
# re.findall — Todas las coincidencias
emails = re.findall(r'\b[\w.-]+@[\w.-]+\.\w{2,}\b', texto)
print(f"Emails: {emails}") # ['soporte@empresa.com', 'admin@ejemplo.es']
# re.match — Solo al inicio de la cadena
m = re.match(r'\d+', "42 artículos en stock")
if m:
print(f"Número inicial: {m.group()}") # 42
# re.fullmatch — Coincidencia exacta de la cadena completa
valido = re.fullmatch(r'\d{4}-\d{2}-\d{2}', "2024-06-15")
print(f"Fecha válida: {valido is not None}")
Sustituir con re.sub
import re
texto = "Precio: $123.45, descuento: $10.00, total: $113.45"
# Sustituir todos los precios por [PRECIO]
resultado = re.sub(r'\$[\d.]+', '[PRECIO]', texto)
print(resultado)
# Precio: [PRECIO], descuento: [PRECIO], total: [PRECIO]
# Sustituir con función (mayúsculas)
texto2 = "hola mundo, hola python"
mayusculas = re.sub(r'\bhola\b', lambda m: m.group().upper(), texto2)
print(mayusculas) # HOLA mundo, HOLA python
# Limpiar HTML
html = "<h1>Título</h1><p>Texto con <strong>negrita</strong> y <em>cursiva</em>.</p>"
limpio = re.sub(r'<[^>]+>', '', html)
print(limpio) # Título Texto con negrita y cursiva.
Grupos y Captura
import re
# Grupos de captura
fechas = ["2024-06-15", "2023-12-31", "2025-01-01"]
patron = re.compile(r'(\d{4})-(\d{2})-(\d{2})')
for fecha in fechas:
m = patron.match(fecha)
if m:
anio, mes, dia = m.groups()
print(f"Año={anio} Mes={mes} Día={dia}")
# Grupos nombrados
texto = "Nombre: Juan García | Email: juan@mail.com | Tel: 600-123-456"
m = re.search(r'Nombre: (?P<nombre>[\w\s]+) \| Email: (?P<email>\S+)', texto)
if m:
print(f"Nombre: {m.group('nombre')}")
print(f"Email: {m.group('email')}")
# Extraer datos de URLs
url = "https://www.ejemplo.com:8080/ruta/pagina?param=valor#seccion"
m = re.match(r'(?P<scheme>https?)://(?P<host>[^:/]+)(?::(?P<port>\d+))?(?P<path>/[^?#]*)', url)
if m:
for k, v in m.groupdict().items():
if v: print(f" {k}: {v}")
Validar Formatos Comunes
import re
PATRONES = {
"email": r'^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$',
"telefono": r'^[+]?[\d\s\-().]{7,15}$',
"url": r'^https?://[\w\-]+(\.[\w\-]+)+(/[\w\-./?%&=]*)?$',
"ip": r'^(\d{1,3}\.){3}\d{1,3}$',
"dni": r'^\d{8}[A-Z]$',
"cp_es": r'^\d{5}$',
"tarjeta": r'^\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}$',
}
def validar(valor, tipo):
patron = PATRONES.get(tipo)
if not patron:
return None
ok = bool(re.fullmatch(patron, valor.strip()))
print(f" [{tipo}] '{valor}': {'VÁLIDO' if ok else 'INVÁLIDO'}")
return ok
validar("usuario@ejemplo.com", "email")
validar("usuario-invalido", "email")
validar("https://misite.com", "url")
validar("192.168.1.1", "ip")
Operaciones Avanzadas
import re
# re.split — Dividir por patrón
texto = "manzanas, peras;uvas|melones y sandías"
frutas = re.split(r'[,;|\s]+', texto)
frutas = [f.strip() for f in frutas if f.strip()]
print(frutas) # ['manzanas', 'peras', 'uvas', 'melones', 'y', 'sandías']
# Compilar para reutilizar (más rápido)
patron_precio = re.compile(r'\b(\d+(?:[.,]\d{1,2})?)\s*€', re.IGNORECASE)
factura = "Producto A: 29,99€, Producto B: 14.50 €, Total: 44,49€"
precios = patron_precio.findall(factura)
print(f"Precios: {precios}") # ['29,99', '14.50', '44,49']
# Lookahead y lookbehind
texto_log = "INFO: conexión OK\nERROR: timeout\nWARNING: memoria baja\nERROR: disco lleno"
errores = re.findall(r'(?<=ERROR: ).+', texto_log)
print(f"Errores: {errores}") # ['timeout', 'disco lleno']
Recurso Adicional
Para convertir y procesar archivos de texto entre distintos formatos sin instalar nada, usa KaijuConverter — gratis y sin registro.
Conversiones relacionadas
Conversiones frecuentes del catálogo: