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

Desafío de Prompting

import re

def censurar_texto():
    print("==================================================")
    print("      CENSURADOR DE PALABRAS EN TEXTO             ")
    print("==================================================\n")

    # 1. Solicitar el texto al usuario
    texto_original = input("Ingrese el texto a procesar:\n> ")
    if not texto_original.strip():
        print("El texto ingresado está vacío. Saliendo del programa.")
        return

    # 2. Solicitar las palabras prohibidas
    entrada_prohibidas = input("\nIngrese las palabras prohibidas separadas por comas:\n> ")
    
    # Procesar la lista de palabras prohibidas:
    # - Dividimos por comas
    # - Eliminamos espacios en blanco al inicio/final de cada palabra
    # - Filtramos posibles entradas vacías (por ejemplo, si el usuario escribe doble coma)
    palabras_prohibidas = [
        palabra.strip() 
        for palabra in entrada_prohibidas.split(",") 
        if palabra.strip()
    ]

    if not palabras_prohibidas:
        print("\nNo se ingresaron palabras prohibidas válidas.")
        print("Texto original sin cambios:")
        print(texto_original)
        return

    # 3. Crear el patrón de expresión regular
    # Usamos re.escape para evitar que caracteres especiales en las palabras rompan la regex.
    # Empleamos límites de palabra '\b' para que no censure partes de otras palabras de forma accidental
    # (por ejemplo, evitar que "carne" censure parcialmente "carnero").
    palabras_escapadas = [re.escape(p) for p in palabras_prohibidas]
    patron_regex = r'\b(' + '|'.join(palabras_escapadas) + r')\b'

    # Función auxiliar para realizar el reemplazo manteniendo la longitud de la palabra encontrada
    def reemplazar(match):
        palabra_detectada = match.group(0)
        return '*' * len(palabra_detectada)

    # 4. Reemplazar e ignorar mayúsculas/minúsculas usando re.IGNORECASE
    # re.subn devuelve una tupla: (texto_modificado, cantidad_de_reemplazos)
    texto_censurado, total_censuradas = re.subn(
        patron_regex, 
        reemplazar, 
        texto_original, 
        flags=re.IGNORECASE
    )

    # 5. Mostrar los resultados por pantalla
    print("\n==================================================")
    print("                    RESULTADOS                    ")
    print("==================================================")
    print(f"Texto original:\n{texto_original}\n")
    print(f"Texto censurado:\n{texto_censurado}\n")
    print(f"Cantidad total de palabras censuradas: {total_censuradas}")
    print("==================================================")

if __name__ == "__main__":
    censurar_texto()

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

2 respuestas

Para cumplir con tus requisitos, he desarrollado un programa en Python interactivo y robusto. Utiliza expresiones regulares (re) para detectar de forma precisa las palabras prohibidas sin importar si están rodeadas de signos de puntuación, manteniendo intactos dichos signos y respetando las mayúsculas/minúsculas originales para la sustitución de longitud exacta.

A continuación presento el archivo con el código fuente completo y documentado.
Censurador de Palabras
29 jun, 1:58

eof

Resumen de la solución:
Uso de Expresiones Regulares (\b): El uso de límites de palabra (\b) asegura que los signos de puntuación pegados a la palabra (como ,, ., !, ?) no impidan la detección de la palabra prohibida y, al mismo tiempo, queden perfectamente preservados en el texto final.

Ignora Mayúsculas/Minúsculas: Al pasar el parámetro flags=re.IGNORECASE a la función de sustitución, el programa identifica "Carne", "CARNE", o "carne" indistintamente.

Cálculo Dinámico del Reemplazo: A través de una función lambda o interna (reemplazar), medimos la longitud exacta del término que coincidió y generamos la misma cantidad de asteriscos (*).

Conteo Automatizado: Aprovechamos re.subn, que además de realizar la sustitución, retorna un contador preciso de todas las ocurrencias que han sido modificadas.

Hola Fabián, espero que estés bien

Parece que te enfrentas a un desafío relacionado con el manejo de signos de puntuación en las palabras prohibidas. El problema es que el programa actual solo detecta palabras exactas, pero no aquellas que están acompañadas de signos de puntuación.

Para solucionar esto, podemos ajustar el patrón de expresión regular para que también considere los signos de puntuación. Aquí te dejo una posible solución modificando el patrón:

import re

def censurar_texto():
    print("==================================================")
    print("      CENSURADOR DE PALABRAS EN TEXTO             ")
    print("==================================================\n")

    # 1. Solicitar el texto al usuario
    texto_original = input("Ingrese el texto a procesar:\n> ")
    if not texto_original.strip():
        print("El texto ingresado está vacío. Saliendo del programa.")
        return

    # 2. Solicitar las palabras prohibidas
    entrada_prohibidas = input("\nIngrese las palabras prohibidas separadas por comas:\n> ")
    
    # Procesar la lista de palabras prohibidas:
    palabras_prohibidas = [
        palabra.strip() 
        for palabra in entrada_prohibidas.split(",") 
        if palabra.strip()
    ]

    if not palabras_prohibidas:
        print("\nNo se ingresaron palabras prohibidas válidas.")
        print("Texto original sin cambios:")
        print(texto_original)
        return

    # 3. Crear el patrón de expresión regular
    palabras_escapadas = [re.escape(p) for p in palabras_prohibidas]
    patron_regex = r'\b(?:' + '|'.join(palabras_escapadas) + r')\b'

    # Función auxiliar para realizar el reemplazo manteniendo la longitud de la palabra encontrada
    def reemplazar(match):
        palabra_detectada = match.group(0)
        return '*' * len(palabra_detectada)

    # 4. Reemplazar e ignorar mayúsculas/minúsculas usando re.IGNORECASE
    texto_censurado, total_censuradas = re.subn(
        patron_regex, 
        reemplazar, 
        texto_original, 
        flags=re.IGNORECASE
    )

    # 5. Mostrar los resultados por pantalla
    print("\n==================================================")
    print("                    RESULTADOS                    ")
    print("==================================================")
    print(f"Texto original:\n{texto_original}\n")
    print(f"Texto censurado:\n{texto_censurado}\n")
    print(f"Cantidad total de palabras censuradas: {total_censuradas}")
    print("==================================================")

if __name__ == "__main__":
    censurar_texto()

Este ajuste debería permitir que el programa detecte palabras prohibidas incluso si están seguidas o precedidas por signos de puntuación. Prueba el código y verifica si ahora se comporta como esperas.

Espero haber ayudado y buenos estudios!