Expresiones regulares

Las expresiones regulares (regex) son secuencias de caracteres que forman un patrón de búsqueda utilizado para encontrar, validar, extraer o reemplazar texto dentro de cadenas. Se usan en programación y procesamiento de texto para tareas como la validación de textos (correos, números de teléfono, hashtags...), la búsqueda de palabras clave en documentos o la transformación de datos.

Por ejemplo, la expresión regular \d+ busca uno o más dígitos en un texto, mientras que ^[A-Za-z]+$ verifica si una cadena contiene solo letras.

import re  # Importa el módulo de expresiones regulares

# Coincidencia exacta con 'match' (busca solo al inicio)
patron = r"hola"
texto = "hola mundo"
coincidencia = re.match(patron, texto)
coincidencia is not None  # => True
coincidencia.start()    # => 0 # Nos informa que empieza en la posición 0
coincidencia.end()    # => 4 # Nos informa que termina en la posición 4

# 'search' busca en todo el texto
patron = r"mundo"
coincidencia = re.search(patron, texto)
coincidencia is not None  # => True
coincidencia.span() # => (5, 10) # Nos informa que empieza en 5 y termina en 10 en forma de tupla

# 'findall' devuelve todas las coincidencias en una lista
texto = "uno dos tres dos"
patron = r"dos"
re.findall(patron, texto)  # => ['dos', 'dos']

# 'sub' reemplaza patrones en el texto
texto = "Me gusta el color azul"
patron = r"azul"
re.sub(patron, "rojo", texto)  # => "Me gusta el color rojo"

# Grupos de captura con paréntesis
texto = "Mi teléfono es 123-456-7890"
patron = r"(\d{3})-(\d{3})-(\d{4})"
coincidencia = re.search(patron, texto)
coincidencia.groups()  # => ('123', '456', '7890')

# Modificadores como re.IGNORECASE (ignorar mayúsculas/minúsculas)
patron = r"python"
texto = "Me gusta PYTHON"
re.search(patron, texto, re.IGNORECASE) is not None  # => True

# Patrones útiles
# .  : Comodín punto. Cualquier caracter
# [^] : Negación. (dentro de los corchetes)
# ^  : Comienza por... (si es al principio de la expresión regular)
# $  : Finaliza por...
# \d : dígitos (0-9)
# \w : caracteres alfanuméricos (a-z, A-Z, 0-9, _)
# \s : espacios en blanco (espacio, tabulación, salto de línea)
# +  : uno o más
# *  : cero o más
# ?  : cero o uno
# [-]  : rango. [a-z](de la a a la z), [0-8](desde el 0 hasta el 8)
# [] : clases de caracteres. ¿Están esos caracteres en el texto sin importar el orden?
# {n,m} : entre n y m repeticiones

# Buscar un correo electrónico
texto = "Contacto: usuario@example.com"
patron = r"[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}"
re.search(patron, texto).group()  # => 'usuario@example.com'

Recursos