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'