Lección 12 · 03 Datos del mundo real
Limpiar texto antes de usarlo
Antes de mandar un texto a un modelo, o de compararlo con otro, conviene limpiarlo: espacios, mayúsculas, saltos de línea y datos que hay que sacar de en medio.
split y join
split corta un texto en una lista; join hace lo contrario:
linea = "[email protected], [email protected] , [email protected]"
partes = [p.strip() for p in linea.split(",")]
print(partes)
print(" | ".join(partes))La línea [p.strip() for p in ...] es una comprensión de lista: un bucle for compacto que construye una lista nueva. Equivale a crear una lista vacía y hacer append en cada vuelta.
Normalizar
Para comparar textos escritos por personas, pásalos todos a la misma forma:
import unicodedata
def normalizar(texto):
texto = unicodedata.normalize("NFKD", texto.strip().lower())
return "".join(c for c in texto if not unicodedata.combining(c))
print(normalizar(" Facturación ") == normalizar("facturacion"))Expresiones regulares: buscar patrones
El módulo re encuentra cosas con una forma concreta, aunque no sepas el texto exacto:
import re
correo = "Hola, soy Ana ([email protected]). La factura F-2026-104 es de 1.250,50 €."
print(re.findall(r"[\w.+-]+@[\w-]+\.[\w.]+", correo)) # emails
print(re.findall(r"F-\d{4}-\d+", correo)) # códigos de factura
print(re.sub(r"\s+", " ", "demasiados espacios \n aquí"))Cuenta palabras
Guarda en n el número de palabras de texto (separadas por espacios, aunque haya varios seguidos). Imprímelo.
¿Atascado? Ver pista
split() sin argumentos corta por cualquier cantidad de espacios y descarta los vacíos: len(texto.split()).
Saca los emails
Guarda en emails todos los emails que aparecen en mensaje, en minúsculas y en el orden en que salen. Imprímelos.
¿Atascado? Ver pista
re.findall(r"[\w.+-]+@[\w-]+\.[\w.]+", mensaje) los encuentra; después pásalos a minúsculas con una comprensión: [e.lower() for e in ...].
Anonimiza antes de enviar
Antes de pasar un texto a un modelo externo hay que quitar los datos personales. Define anonimizar(texto) que sustituya cada email por [EMAIL] y cada teléfono de 9 cifras por [TELEFONO].
¿Atascado? Ver pista
Dos re.sub seguidos: texto = re.sub(r"[\w.+-]+@[\w-]+\.[\w.]+", "[EMAIL]", texto) y re.sub(r"\b\d{9}\b", "[TELEFONO]", texto). Devuelve el resultado.