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í"))
No hace falta memorizar expresiones regulares. Basta con saber que existen, entender las sencillas y probar siempre con ejemplos reales, como acabas de hacer.
// reto 01

Cuenta palabras

Guarda en n el número de palabras de texto (separadas por espacios, aunque haya varios seguidos). Imprímelo.

main.py
Ctrl/⌘ + Enter
¿Atascado? Ver pista

split() sin argumentos corta por cualquier cantidad de espacios y descarta los vacíos: len(texto.split()).

$ python main.py
    // reto 02

    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.

    main.py
    Ctrl/⌘ + Enter
    ¿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 ...].

    $ python main.py
      // reto 03

      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].

      main.py
      Ctrl/⌘ + Enter
      ¿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.

      $ python main.py