Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

Haga lo que hicimos en el aula

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

import os
import re

def crear_archivo_demostracion(ruta_archivo="palabras_prohibidas.txt"):
    """
    Crea un archivo de texto de ejemplo con palabras prohibidas
    si este no existe en el entorno de ejecución.
    """
    palabras_ejemplo = ["secreto", "prohibido", "malo", "error", "falso"]
    if not os.path.exists(ruta_archivo):
        try:
            with open(ruta_archivo, "w", encoding="utf-8") as archivo:
                archivo.write("\n".join(palabras_ejemplo))
            print(f"[INFO] Archivo de demostración creado: '{ruta_archivo}'")
        except Exception as e:
            print(f"[ERROR] No se pudo crear el archivo de demostración: {e}")


def cargar_palabras_prohibidas(ruta_archivo):
    """
    Lee un archivo de texto y carga dinámicamente la lista de palabras prohibidas.
    Implementa control de errores para asegurar la robustez del programa.
    """
    palabras = set()
    try:
        # Abrimos el archivo con codificación UTF-8 para soportar tildes y caracteres especiales
        with open(ruta_archivo, "r", encoding="utf-8") as archivo:
            for linea in archivo:
                palabra = linea.strip()
                if palabra:  # Evita agregar líneas vacías
                    # Guardamos en minúsculas para facilitar comparaciones posteriores
                    palabras.add(palabra.lower())
        print(f"[ÉXITO] Se cargaron {len(palabras)} palabras prohibidas desde '{ruta_archivo}'.")
    except FileNotFoundError:
        print(f"[ERROR] El archivo '{ruta_archivo}' no fue encontrado. Verifique la ruta.")
    except PermissionError:
        print(f"[ERROR] No se tienen permisos para leer el archivo '{ruta_archivo}'.")
    except Exception as e:
        print(f"[ERROR] Ocurrió un error inesperado al leer el archivo: {e}")
    
    return palabras


def censurar_texto(texto, palabras_prohibidas):
    """
    Reemplaza las palabras prohibidas dentro de un texto por asteriscos (***).
    Es insensible a mayúsculas/minúsculas y respeta los límites de las palabras.
    """
    if not palabras_prohibidas:
        return texto

    texto_censurado = texto
    for palabra in palabras_prohibidas:
        # Escapamos la palabra por si contiene caracteres especiales en regex
        palabra_escapada = re.escape(palabra)
        
        # Expresión regular:
        # \b asegura que coincida con palabras completas (evita censurar 'malo' dentro de 'malogrado')
        # re.IGNORECASE permite ignorar la diferencia entre mayúsculas y minúsculas
        patron = re.compile(rf"\b{palabra_escapada}\b", re.IGNORECASE)
        
        # Reemplazamos la palabra con una cantidad equivalente de asteriscos o una cadena fija
        # En este caso, usamos una cantidad de asteriscos equivalente al largo de la palabra original
        def reemplazo(match):
            return "*" * len(match.group(0))
            
        texto_censurado = patron.sub(reemplazo, texto_censurado)
        
    return texto_censurado


def ejecutar_demostracion():
    """
    Función principal que simula un flujo de trabajo de censura de texto.
    """
    nombre_archivo = "palabras_prohibidas.txt"
    
    # 1. Preparar entorno (crear archivo si no existe)
    crear_archivo_demostracion(nombre_archivo)
    
    # 2. Cargar palabras dinámicamente con control de errores
    palabras_prohibidas = cargar_palabras_prohibidas(nombre_archivo)
    
    # Texto de prueba con variaciones de mayúsculas, minúsculas y puntuación
    texto_original = (
        "Este es un SECRETO muy grande. El resultado contiene un Error grave "
        "y el comportamiento es MALO. No debemos difundir información de tipo falso, "
        "pero 'falsificador' no debería ser censurado."
    )
    
    print("\n--- PROCESO DE CENSURA ---")
    print("Texto Original:")
    print(texto_original)
    
    # 3. Aplicar censura
    texto_final = censurar_texto(texto_original, palabras_prohibidas)
    
    print("\nTexto Censurado:")
    print(texto_final)
    print("--------------------------\n")
    
    # 4. Prueba de manejo de errores (Intento de leer un archivo inexistente)
    print("Probando el manejo de errores con un archivo inexistente...")
    cargar_palabras_prohibidas("archivo_fantasma.txt")


if __name__ == "__main__":
    ejecutar_demostracion()
2 respuestas

Presento a continuación el código fuente en Python diseñado para resolver este problema. El script está estructurado de manera robusta, con manejo de excepciones para la lectura de archivos, soporte completo para variaciones de mayúsculas/minúsculas mediante expresiones regulares, y un mecanismo de demostración automática que facilita su ejecución inmediata en entornos como Google Colab, ChatGPT o de forma local.
Censurador de Texto

Resumen de características implementadas:
Carga dinámica y robusta: El método cargar_palabras_prohibidas maneja excepciones comunes como FileNotFoundError y de permisos (PermissionError), evitando que el programa se detenga bruscamente.

Insensibilidad a mayúsculas/minúsculas: Utiliza el motor de expresiones regulares (re) con la bandera re.IGNORECASE para identificar variaciones como SECRETO, Secreto o secreto.

Respeto a los límites de palabra (\b): Evita falsos positivos. Por ejemplo, si la palabra prohibida es "malo", censurará "malo" o "Malo", pero no afectará a palabras que la contengan parcialmente como "malogrado" o "falsificador".

Portabilidad (Colab, Jupyter, Local): Al incluir una función autoejecutable que crea el archivo de palabras prohibidas si no existe, puedes copiar y pegar el código directamente en Google Colab o en cualquier terminal Python y funcionará al instante sin configuraciones previas.

Hola, Fabián! ¿Cómo vas?

Gracias por compartir tus aprendizajes con la comunidad Alura.

Tu solución quedó muy completa, principalmente al separar el código en funciones como crear_archivo_demostracion, cargar_palabras_prohibidas y censurar_texto, lo que facilita la lectura, la reutilización y las pruebas. También fue muy acertado usar try/except para tratar errores como FileNotFoundError y PermissionError, además de aplicar re.IGNORECASE y \b para que la censura funcione sin depender de mayúsculas o minúsculas y sin afectar partes internas de otras palabras.

Sigue adelante con tu trabajo, y no dudes en regresar al foro si tienes alguna pregunta o necesitas ayuda.

Alura Cuenta con el apoyo de la comunidad Alura en tu camino. ¡Un abrazo y buenos estudios!