2016-07-18 26 views
0

Ich habe zwei Funktionen in Python geschrieben. Wenn ich replace() ausführe, sieht es sich die Datenstruktur mit dem Namen replacements an. Es nimmt den Schlüssel, durchläuft das Dokument und wenn es einem Schlüssel im Dokument entspricht, wird das Wort durch den Wert ersetzt.Python suchen und ersetzen

Jetzt scheint es, was passiert, weil ich auch die umgekehrte ('gestoppt' Änderungen an 'suspended' und 'suspended' Änderungen an 'gestoppt', je nachdem, was in der Textdatei ist), scheint es, dass als es geht durch die Datei, einige Wörter werden geändert, und dann wieder geändert (dh, so dass keine Änderungen vorgenommen werden)

wenn ich replace2() ausführen Ich nehme jedes Wort aus dem Textdokument, und sehen, ob dies ein Schlüssel ist Ersatz. Wenn es ist, ersetze ich es. Was ich jedoch bemerkt habe, wenn ich das ausführe, suspendiert (enthält die Teilzeichenfolge "ended") endet als "susfinished"?

Gibt es eine einfachere Möglichkeit, die Textdatei zu durchlaufen und das Wort nur einmal zu ändern, falls gefunden? Ich denke, dass replace2() tut, was ich will, obwohl ich Phrasen verliere, aber es scheint auch Teilstrings aufzunehmen, was es nicht tun sollte, da ich die split() Funktion benutzt habe.

def replace(): 
     fileinput = open('tennis.txt').read() 
     out = open('tennis.txt', 'w') 
     for i in replacements.keys(): 
      fileinput = fileinput.replace(i, replacements[i]) 
      print(i, " : ", replacements[i]) 
     out.write(fileinput) 
     out.close 


def replace2(): 
     fileinput = open('tennis.txt').read() 
     out = open('tennis.txt', 'w') 
     #for line in fileinput: 
     for word in fileinput.split(): 
      for i in replacements.keys(): 
       print(i) 
       if word == i: 
        fileinput = fileinput.replace(word, replacements[i]) 
     out.write(fileinput) 
     out.close 

replacements = { 
    'suspended' : 'stopped', 
    'stopped'  : 'suspended', 
    'due to'  : 'because of', 
    'ended'  : 'finished', 
    'finished'  : 'ended', 
    '40'   : 'forty', 
    'forty'  : '40', 
    'because of' : 'due to' } 

das Spiel endete wegen gerade einmal 40 Minuten regnen, nachdem er gestartet. Es war wegen Regen ausgesetzt.

Antwort

1

Verbesserte Version von Rawbeans beantworten. Es hat nicht wie erwartet funktioniert, da einige Ihrer Ersatzschlüssel mehrere Wörter enthalten.

mit Ihrem Beispiel Linie getestet und es gibt: the match finished because of rain a mere forty minutes after it started. it was stopped due to rain.

import re 

def replace2(): 
    fileinput = open('tennis.txt').read() 
    out = open('tennisout.txt', 'w') 
    #for line in fileinput: 

    wordpats = '|'.join(replacements.keys()) 
    pattern = r'({0}|\w+|\W|[.,!?;-_])'.format(wordpats) 
    words = re.findall(pattern, fileinput) 
    output = "".join(replacements.get(x, x) for x in words) 
    out.write(output) 
    out.close() 


replacements = { 
    'suspended' : 'stopped', 
    'stopped'  : 'suspended', 
    'due to'  : 'because of', 
    'ended'  : 'finished', 
    'finished'  : 'ended', 
    '40'   : 'forty', 
    'forty'  : '40', 
    'because of' : 'due to' } 


if __name__ == '__main__': 
    replace2() 
0

gibt es einen einfacheren Weg durch die Textdatei zu durchlaufen und nur das Wort einmal ändern, wenn sie gefunden?

Es gibt eine viel einfachere Art und Weise:

output = " ".join(replacements.get(x, x) for x in fileinput.split()) 
out.write(output) 
+0

in diesem Fall, wenn das Wort (können sagen, „40“) 4-mal im Text erscheint, möchte ich alle Vorkommen von 40 zu sein geändert zu "vierzig". Meine Referenz, das Wort nur einmal zu ändern, war die replace() -Funktion. Dies ersetzt das Wort "40" bis "vierzig" und dann wieder scheint es auf das ursprüngliche "40" zurück. – user1031551

+0

Aktualisierte meine Antwort .. – SuperSaiyan

+0

Das Hauptproblem hier ist, dass Interpunktion nicht berücksichtigt wird. Wenn Sie nach einem Wort einen Punkt oder ein Komma haben, wird es nicht ersetzt. – rawbeans

0

Um Interpunktion zu Konto, einen regulären Ausdruck anstelle von split():

output = " ".join(replacements.get(x, x) for x in re.findall(r"[\w']+|[.,!?;]", fileinput)) 
out.write(output) 

Auf diese Weise wird Zeichensetzung während des ersetzen außer Acht gelassen werden, aber wird in der letzten Zeichenfolge vorhanden sein. Eine Erläuterung und mögliche Einschränkungen finden Sie unter this post.