2013-07-18 12 views
5

Ich habe ein Skript, das in meinen Text läuft und alle Sätze, die ich schreibe, in einer Datenbank ablegt und ersetzt.Suchen und Ersetzen mit "Nur ganzes Wort" Option

Das Skript:

with open('C:/Users/User/Desktop/Portuguesetranslator.txt') as f: 
    for l in f: 
     s = l.split('*') 
     editor.replace(s[0],s[1]) 

und die Datenbank Beispiel:

Event*Evento* 
result*resultado* 

Und so weiter ...

Nun, was passiert ist, dass ich das brauche "nur mit ganzen Wörtern" in diesem Skript, weil ich mich mit Problemen befinde.

Zum Beispiel mit Result und Event, denn wenn ich für Resultado ersetzen und Evento, und ich das Skript noch einmal im Text das Skript ersetzen wieder die Resultado und Evento.

Und das Ergebnis nach dem Ausführen des Skripts bleibt so Resultadoado und Eventoo.

Nur damit Sie wissen Jungs .. Es ist nicht nur für Veranstaltungs- und Ergebnis gibt es mehr als 1000 Sätze, die ich bereits für die Suche eingestellt und ersetzen .. arbeiten

Ich brauche nicht ein simples suche und ersetze für zwei Wörter .. weil ich die Datenbank für verschiedene Sätze immer wieder bearbeiten werde ..

+0

'ist eine Zeichenfolge editor'? – kindall

Antwort

5

Verwenden Sie re.sub anstelle von normalen Zeichenfolge ersetzen, um nur ganze Wörter zu ersetzen.So Ihr Skript, auch wenn es Läuft erneut, ersetzt die bereits ersetzten Wörter nicht.

>>> import re 
>>> editor = "This is result of the match" 
>>> new_editor = re.sub(r"\bresult\b","resultado",editor) 
>>> new_editor 
'This is resultado of the match' 
>>> newest_editor = re.sub(r"\bresult\b","resultado",new_editor) 
>>> newest_editor 
'This is resultado of the match' 
+0

wo ersetzen ich das –

+0

nur um darauf hinzuweisen .. das bin ich komplett neu zu Codierung und Zeug, –

+0

nur so wissen Sie .. die Datenbank enthält mehr als 1400 Wörter .. und Ergebnis und Ereignis sind nur Beispiele .. –

11

Sie möchten einen regulären Ausdruck. Sie können das Token \b verwenden, um eine Wortgrenze zu finden: d. H. \bresult\b würde nur mit dem genauen Wort "result" übereinstimmen.

import re 

with open('C:/Users/User/Desktop/Portuguesetranslator.txt') as f: 
    for l in f: 
     s = l.split('*') 
     editor = re.sub(r"\b%s\b" % s[0] , s[1], editor) 
+0

ich sollte ersetze das für mein momentanes Skript? und in der Datenbank sollte ich das \ b vor jedem Wort hinzufügen? –

+0

zum Beispiel \ bresult * \ bresultado *? –

+1

Ersetzen Sie einfach den Code, den Sie haben ... das Skript fügt die '\ b's hinzu, so dass Sie sie nicht in der" Datenbank "haben müssen. – kindall

7

Verwendung re.sub:

replacements = {'the':'a', 
       'this':'that'} 

def replace(match): 
    return replacements[match.group(0)] 

# notice that the 'this' in 'thistle' is not matched 
print re.sub('|'.join(r'\b%s\b' % re.escape(s) for s in replacements), 
     replace, 'the cat has this thistle.') 

Drucke

a cat has that thistle. 

Hinweise:

  • Alle Saiten ersetzt werden sollen Jojne d in ein einziges Muster so , dass die Zeichenfolge nur einmal durchlaufen werden muss.

  • Die Quell-Strings werden an re.escape übergeben, um zu vermeiden, dass sie als reguläre Ausdrücke interpretiert werden ( ).

  • Die Wörter sind von r'\b' umgeben, um sicherzustellen, dass Übereinstimmungen für ganze Wörter nur sind.

  • Es wird eine Ersatzfunktion verwendet, damit jede Übereinstimmung ersetzt werden kann.

1

Es ist sehr einfach. Verwenden Sie re, verwenden Sie nicht ersetzen.

import re 
replacements = {r'\bthe\b':'a', 
       r'\bthis\b':'that'} 

def replace_all(text, dic): 
    for i, j in dic.iteritems(): 
     text = re.sub(i,j,text) 
    return text 

replace_all("the cat has this thistle.", replacements) 

Es druckt

a cat has that thistle.