Expresiones regulares con re
Introducción
Las expresiones regulares son patrones de búsqueda que permiten realizar operaciones avanzadas con cadenas de texto. En Python, el módulo re
proporciona todas las herramientas necesarias para trabajar con estos patrones, permitiéndonos buscar, extraer, reemplazar y validar texto de forma potente y flexible. Aunque al principio pueden parecer crípticas, las expresiones regulares son una habilidad fundamental para cualquier programador que trabaje con procesamiento de texto.
Conceptos básicos de expresiones regulares
Las expresiones regulares (también llamadas "regex") son secuencias de caracteres que forman un patrón de búsqueda. Veamos cómo importar el módulo re
y empezar a utilizarlo:
import re
# Buscamos la palabra "Python" en una cadena
texto = "Estoy aprendiendo Python en 2025"
resultado = re.search("Python", texto)
if resultado:
print("¡Encontrado!")
print(f"La palabra comienza en la posición {resultado.start()} y termina en {resultado.end()}")
else:
print("No encontrado")
Funciones principales del módulo re
El módulo re
ofrece varias funciones fundamentales:
1. re.search()
Busca un patrón en una cadena y devuelve el primer resultado:
resultado = re.search(patron, texto)
2. re.match()
Similar a search()
, pero solo busca al inicio de la cadena:
# Solo encuentra "Hola" si está al principio
resultado = re.match("Hola", texto)
3. re.findall()
Encuentra todas las ocurrencias de un patrón y devuelve una lista:
# Encuentra todos los números en el texto
numeros = re.findall(r'\d+', "Tengo 3 manzanas y 2 peras")
print(numeros) # ['3', '2']
4. re.sub()
Sustituye las coincidencias por otro texto:
# Reemplaza los números por "X"
nuevo_texto = re.sub(r'\d', 'X', "Mi teléfono es 123456789")
print(nuevo_texto) # Mi teléfono es XXXXXXXXX
5. re.split()
Divide una cadena según un patrón:
# Divide usando espacios o comas como separadores
palabras = re.split(r'[, ]+', "manzanas, peras naranjas,plátanos")
print(palabras) # ['manzanas', 'peras', 'naranjas', 'plátanos']
Metacaracteres y símbolos especiales
Los metacaracteres son caracteres con significado especial en las expresiones regulares:
# Algunos metacaracteres importantes
# . - Cualquier carácter excepto nueva línea
# ^ - Inicio de cadena
# $ - Fin de cadena
# * - 0 o más repeticiones
# + - 1 o más repeticiones
# ? - 0 o 1 repetición
# {} - Número específico de repeticiones
# [] - Conjunto de caracteres
# | - O lógico (alternativa)
# () - Agrupación
# Ejemplos:
emails = re.findall(r'[\w.-]+@[\w.-]+\.\w+', "Contacta con juan@ejemplo.com o maria@correo.es")
print(emails) # ['juan@ejemplo.com', 'maria@correo.es']
Clases de caracteres comunes
Las clases de caracteres nos permiten definir conjuntos de caracteres:
# \d - Dígito (0-9)
# \D - No dígito
# \w - Carácter de palabra (letras, números, _)
# \W - No carácter de palabra
# \s - Espacio en blanco
# \S - No espacio en blanco
# Ejemplo: encontrar palabras que contengan números
palabras_con_numeros = re.findall(r'\w*\d+\w*', "abc123 def xyz789")
print(palabras_con_numeros) # ['abc123', 'xyz789']
Grupos de captura
Los paréntesis permiten crear grupos de captura para extraer partes específicas:
texto = "Mi nombre es Ana y tengo 25 años"
resultado = re.search(r'Mi nombre es (\w+) y tengo (\d+) años', texto)
if resultado:
nombre = resultado.group(1)
edad = resultado.group(2)
print(f"Nombre: {nombre}, Edad: {edad}") # Nombre: Ana, Edad: 25
Uso de flags
Los flags modifican el comportamiento de las expresiones regulares:
# re.IGNORECASE o re.I - Ignora mayúsculas/minúsculas
resultado = re.search("python", "Aprendo PYTHON", re.IGNORECASE)
print(resultado is not None) # True
# re.MULTILINE o re.M - ^ y $ coinciden con inicio/fin de cada línea
texto_multilinea = "Línea 1\nLínea 2\nLínea 3"
resultado = re.findall(r'^Línea', texto_multilinea, re.MULTILINE)
print(resultado) # ['Línea', 'Línea', 'Línea']
# re.DOTALL o re.S - El punto coincide también con saltos de línea
Expresiones regulares compiladas
Para patrones que se utilizan varias veces, es más eficiente compilarlos:
# Compilar un patrón
patron = re.compile(r'\b\w{5}\b') # Palabras de exactamente 5 letras
# Usar el patrón compilado
texto = "Hola a todos los amigos del curso de Python"
palabras_5 = patron.findall(texto)
print(palabras_5) # ['todos', 'amigos', 'curso']
Validación de formatos comunes
Las expresiones regulares son perfectas para validar formatos:
def validar_email(email):
patron = r'^[\w.-]+@[a-zA-Z\d.-]+\.[a-zA-Z]{2,}$'
return re.match(patron, email) is not None
def validar_telefono_espanol(telefono):
patron = r'^(?:(?:\+|00)34[-\s]?)?[6789]\d{8}$'
return re.match(patron, telefono) is not None
# Probamos las funciones
print(validar_email("usuario@dominio.com")) # True
print(validar_email("usuario@.com")) # False
print(validar_telefono_espanol("612345678")) # True
print(validar_telefono_espanol("912345678")) # True
print(validar_telefono_espanol("51234567")) # False
Lookbehind y Lookahead
Estas son técnicas avanzadas para buscar patrones solo si están precedidos o seguidos por otros:
# Lookahead positivo (?=...)
# Números seguidos de "€"
precios = re.findall(r'\d+(?=\s*€)', "Tenemos productos de 10 € y 20€")
print(precios) # ['10', '20']
# Lookbehind positivo (?<=...)
# Palabras precedidas por "Sr."
nombres = re.findall(r'(?<=Sr\.\s)\w+', "Sr. García y Sr. Pérez")
print(nombres) # ['García', 'Pérez']
Consejos de uso
- Empieza con patrones simples y ve añadiendo complejidad
- Usa sitios de prueba online como regex101.com para probar tus expresiones
- Cuando trabajes con patrones complejos, utiliza comentarios con el flag
re.VERBOSE
# Expresión regular con comentarios
patron = re.compile(r'''
^ # Inicio de la cadena
[\w.-]+ # Parte local del email
@ # Símbolo @
[a-zA-Z\d.-]+ # Dominio sin TLD
\. # Punto
[a-zA-Z]{2,} # TLD (com, es, org, etc.)
$ # Fin de la cadena
''', re.VERBOSE)
Resumen
Las expresiones regulares son una herramienta poderosa para manipular y analizar texto. El módulo re
de Python proporciona todas las funcionalidades necesarias para trabajar con ellas de manera efectiva. Aunque la sintaxis puede parecer complicada al principio, con práctica se convierten en un recurso indispensable para cualquier tarea que involucre procesamiento de texto.
Dominar las expresiones regulares te permitirá realizar operaciones de búsqueda, extracción y validación de texto que serían extremadamente difíciles o verbosas con métodos tradicionales. En los próximos temas, veremos cómo aplicar este conocimiento junto con otras bibliotecas para tareas de procesamiento de datos más avanzadas.