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()