2013-07-18 13 views
5

Ho uno script che viene eseguito nel mio testo e cerca e sostituisce tutte le frasi che scrivo in un database.Cerca e sostituisci con l'opzione "solo parola intera"

Lo script:

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

E l'esempio database:

Event*Evento* 
result*resultado* 

E così via ...

Ora, ciò che sta accadendo è che ho bisogno di "parola intera solo" in quella sceneggiatura, perché mi sto trovando con problemi.

Ad esempio, con Result e Event, perché quando sostituisco per Resultado e Evento, e faccio funzionare lo scritto ancora una volta nel testo dello script sostituire nuovamente il Resultado e Evento.

E il risultato dopo aver eseguito lo script rimane come questo Resultadoado e Eventoo.

Appena così sapere ragazzi .. La sua non solo per eventi e risultati, non v'è più di 1000+ frasi che ho già impostato per la ricerca e la sostituzione di lavorare ..

non ho bisogno di un simples cerca e sostituisci per due parole .. perché sto andando a modificare il database più e più volte per diverse frasi ..

+0

è 'editor' una stringa? – kindall

risposta

5

Utilizzare re.sub invece di stringa normale sostituire per sostituire solo parole intere.Così il tuo script, anche se esso esegue di nuovo non sostituirà le parole già sostituite.

>>> 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

dove si sostituisce quello –

+0

solo far notare che .. im completamente nuovo per la codifica e la roba, –

+0

solo così sai .. il database contiene più di 1400 parole .. e Risultato ed eventi sono solo esempi .. –

11

Vuoi un'espressione regolare. È possibile utilizzare il token \b per abbinare un limite di parole: ad esempio, \bresult\b corrisponderebbe solo alla parola esatta "risultato".

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

dovrei sostituirlo per il mio script corrente? e nel database dovrei aggiungere il \ b prima di ogni parola? –

+0

per esempio \ bresult * \ bresultado *? –

+1

Basta sostituire il codice che hai con questo ... lo script aggiunge il '\ b's in modo da non doverli avere nel" database ". – kindall

7

Uso 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.') 

Stampe

a cat has that thistle. 

Note:

  • tutte le stringhe da sostituire sono sposano d in un singolo pattern in modo da che la stringa deve essere ripetuta su una sola volta.

  • Le stringhe di origine vengono passate a re.escape per evitare l'interpretazione di come espressioni regolari.

  • Le parole sono circondate da r'\b' per assicurarsi che le corrispondenze siano solo per le parole .

  • Una funzione di sostituzione viene utilizzata in modo che qualsiasi corrispondenza possa essere sostituita.

1

È molto semplice. usa re.sub, non usare replace.

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) 

Sarà stampata

a cat has that thistle. 
Problemi correlati