Seite 1 von 1

Zensieren eines Textes

Verfasst: Sonntag 13. Dezember 2015, 13:23
von Magnetonstar
Hallo zusammen,

Ich habe eine Funktion programmieren, die einen Text mit einer Liste von Fluchwörter zensiert. Anstelle des Fluchwortes soll es '*' geben.
Doch obwohl ich alles durchdacht habe, kommt der Text genau gleich wie vorher raus. Und ich sehe nicht wo mein Fehler liegt. Könnt ihr mir helfen?

Code: Alles auswählen

def censor(text, curse):
    liste = text.split()
    new_text = []
    for word in liste:
            new_text.append(word) if word.lower() not in curse else new_text.append("*" * len(x) for x in curse if x == word.lower())
    return ' '.join(new_text)

curse = ["Scheiss", 'Verdammt']

print(censor("Ach, verdammt! Mein scheiss Leben! Verdammt mein scheiss Leben!", curse))
Danke schon im Vorraus.
Lg Jerome

Re: Zensieren eines Textes

Verfasst: Sonntag 13. Dezember 2015, 13:29
von cofi
Schau dir mal genau an, wie das Wort aussehen muss, nach dem du in der `curse` Liste suchst und wie die Woerter aussehen, die dort tatsaechlich enthalten sind.

Abseits davon ist auch die Erzeugung der Sterne falsch. Breche Zeile 5 in eine echte `if` Abfrage auf und dann sollte das auffallen.
Das Ziel ist es nicht so wenige Zeilen wie moeglich zu brauchen, sondern, dass man tatsaechlich lesbaren und verstaendlichen Code erzeugt. Ich sage mal du hast dich da in Zeile 5 selbst ausgetrickst.

Re: Zensieren eines Textes

Verfasst: Sonntag 13. Dezember 2015, 13:45
von Magnetonstar
cofi hat geschrieben:Schau dir mal genau an, wie das Wort aussehen muss, nach dem du in der `curse` Liste suchst und wie die Woerter aussehen, die dort tatsaechlich enthalten sind.

Abseits davon ist auch die Erzeugung der Sterne falsch. Breche Zeile 5 in eine echte `if` Abfrage auf und dann sollte das auffallen.
Das Ziel ist es nicht so wenige Zeilen wie moeglich zu brauchen, sondern, dass man tatsaechlich lesbaren und verstaendlichen Code erzeugt. Ich sage mal du hast dich da in Zeile 5 selbst ausgetrickst.
Danke Vielmals!
Ja du hast Recht, ich hatte wirklich versucht, den Code in möglichst wenigen Zeilen zu schreiben und dabei vollkommen vergessen, dass das wichtigste bei einem Code die Verständlichkeit ist.

Nun hab ich den Fehler gefunden, weiss aber nicht wie ich ihn beheben soll.

Code: Alles auswählen

def censor(text, curse):
    liste = text.split()
    new_text = []
    print(liste)
    for word in liste:
    	if word.lower() not in curse:
    		new_text.append(word)
    	else:
       		new_text.append("*" * len(word))
    return ' '.join(new_text)

curse = ["scheiss", 'verdammt']

print(censor("Ach, verdammt! Mein scheiss Leben! Verdammt mein scheiss Leben!", curse))
Es zensiert ja nicht das 'verdammt!' wegen dem Ausrufezeichen.
Wie soll ich nun das beheben?

Re: Zensieren eines Textes

Verfasst: Sonntag 13. Dezember 2015, 15:06
von nezzcarth
Da gibt es verschiedene Möglichkeiten. Eine gängige Variante ist z.B., die Texteingabe vorher mittels einer separaten Funktion zu normalisieren.

Re: Zensieren eines Textes

Verfasst: Sonntag 13. Dezember 2015, 20:29
von BlackJack
@Magnetonstar: Du brauchst halt einfach einen anderen Ansatz als das doch eher simple `str.split()` um die Eingabe in Worte zu zerlegen. Eine Methode die auch Buchstaben von Satzzeichen trennt. Das ist recht einfach mit einem regulären Ausdruck machbar. Dafür gibt es in Python das `re`-Modul.

Code: Alles auswählen

import re


def censor_text(text, curses):
    return ''.join(
        '*' * len(s) if s.lower() in curses else s
        for s in re.split(r'(\w+)', text)
    )


def main():
    print(
        censor_text(
            'Ach, verdammt! Mein scheiss Leben! Verdammt mein scheiss Leben!',
            {'scheiss', 'verdammt'}
        )
    )
 

if __name__ == '__main__':
    main()