2017-10-24 1 views
0

So ist die Herausforderung, ein bestimmtes Wort in einem Satz mit Sternchen mit äquivalenter Länge dieses Wort zu ersetzen war - 3 Buchstaben -> 3 Sterne usw.Python - Ersetzen der Werte in einem String

Ersten Abschnitt nicht funktioniert, aber Zweiten Abschnitt tut - kann jede Kritik Ersten Abschnitt und vielleicht die möglichen Fehler hinweist ich mache als die Logik Ton schien ursprünglich

def censor(text, word): 
    for c in text: 
    if c == word:       ## this line was totally wrong 
     text.replace(c, "*" * len(c)) 
    return text 

das nächste Segment ist die Arbeit, dann Codecademy Antwort war viel anders aus:

def censor(text, word): 
    a = "*" * len(word) 
    for c in text: 
    nw = text.split(word) 
    return a.join(nw) 

Wie würden Sie diese Aufgabe angehen?

+0

Ist 'text' eine Liste oder ein String? – mypetlion

+0

Hinweis. Betrachten Sie den Code 'x =" Hallo "; x.replace ("H", "J"); drucken (x) '. Was erwarten Sie von der Ausgabe? – Kevin

+0

Was ist Ihre konkrete Frage (Sie sollten nicht wirklich nach unseren Meinungen fragen - diese variieren)? Was ist die erwartete Eingabe und Ausgabe? Bitte werfen Sie einen Blick auf [mcve]. Welche Werte werden auch in 'text' und' word' übernommen? Es sieht so aus, als ob Sie über Buchstaben im Text iterieren und sie mit Wörtern vergleichen. – Bahrom

Antwort

1

Die zweite Lösung ist nicht perfekt, entweder:

def censor(text, word): 
    a = "*" * len(word) 
    nw = text.split(word) # no need for a loop here, one split catches all occurrences 
    return a.join(nw) 

Für Ihren ersten Versuch:

def censor(text, word): 
    # for c in text: # loops char by char 
    # if c == word: # one character likely won't be your word 
    # text.replace(c, "*" * len(c)) # does nothing, string is immutable 
    return text.replace(word, "*" * len(word)) # simple! 
+0

Es ist wahrscheinlich eine gute Idee für die erste Aufgabe, sich auf Whitespaces zu trennen und den Austausch in einer Schleife durchzuführen, sodass Sie keine Wörter ersetzen, die das Zielwort enthalten, wie in Doncho Gunchevs Beispiel 'air' - 'airplane'. –

+0

Habe den Loop-Fehler im ersten Teil nicht erkannt - ich muss gedacht haben, dass ich immer noch irgendwie durch iterieren musste. Freut mich zu sehen, dass ich mit dem Text nicht allzu weit weg war. Im ersten Teil (c, "*" * len (c)) macht es mehr Sinn, jetzt, wo ich weiß, dass ich durch die Zeichen schlenderte. Vielen Dank! – Glaube

0

Im ersten Teil des Codes durchlaufen Sie die Zeichenkette Zeichen für Zeichen - Sie werden nie ein Wort finden.

Ich würde regulären Ausdruck import re in diesem Fall verwenden, um es schneller zu machen und das richtige Wort zu finden. Versuchen Sie, das Wort "Luft" im Satz The airplane is in the air now! zu maskieren.

Beispiel mit re.

re.sub(r'\bair\b', '***', 'The airplane is in the air now!', flags=re.IGNORECASE) 
+0

Was lässt Sie denken, dass Regex für diese Aufgabe schneller wäre? Das OP macht eine einfache String-Ersetzungsoperation, sie brauchen dafür keine Regex. –

+0

Das korrekte Finden des "Wortes" ist bestenfalls schwierig ohne reguläre Ausdrücke ... Kompilierte reguläre Ausdrücke sind schnell und korrekt, aber langsamer als die einfache (inkorrekte) String-Manipulation. –

0

Sie können dies versuchen:

s = "hello, how are you?" 
word = "hello" 
import re 
final_string = re.sub("\b"+re.escape(word)+"\b", '*'*len(word), s) 

Ausgang:

'*****, how are you?' 
+0

Sie brauchen '\ b' um' word' um richtig zu passen. Auch, re.escape (Wort) ', nicht nur Wort. Escaping ist wichtig, oder Sie erhalten https://en.wikipedia.org/wiki/Code_injection :-) –

+0

@DonchoGunchev danke, dass Sie darauf hingewiesen haben. Ich wusste nicht, dass Python 're' anfällig für Code-Injection war. – Ajax1234

+0

Sie können RegExp injection bekommen, was ist, wenn' word = '.'' oder 'word ='. * ''? Das Schlimmste, an das ich denken kann, ist ein komplexes Muster, das Stunden braucht, um zu passen/nicht zu passen ... also DOS. Faustregel: Wenn es Sonderzeichen gibt - entkomme sie (html, js, re, sql, you_name_it)! –

0

Der Regex-Ansatz ist gut. Ein anderer Weg wäre, den Satz durch Leerzeichen aufzuteilen, nach dem zu zensierenden Wort zu suchen und es durch Sternchen zu ersetzen.

def censor(sentence, word): 
    return " ".join([w if w != word else "*"*len(w) for w in sentence.split(" ")]) 

Obwohl das mit Interpunktion nicht funktionieren würde.

Verwandte Themen