Zensieren eines Textes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Magnetonstar
User
Beiträge: 14
Registriert: Montag 16. November 2015, 18:46

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Magnetonstar
User
Beiträge: 14
Registriert: Montag 16. November 2015, 18:46

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?
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Da gibt es verschiedene Möglichkeiten. Eine gängige Variante ist z.B., die Texteingabe vorher mittels einer separaten Funktion zu normalisieren.
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()
Antworten