La risposta proposta da @nhahtdh è valida, ma direi che è meno pitone di un esempio canonico, che usa un codice meno opaco rispetto alla sua regex manipolazioni e sfrutta le strutture di dati e la funzione anonima incorporate di python.
Un dizionario di traduzioni ha senso in questo contesto. In effetti, è così che il Python Cookbook lo fa, come mostrato in questo esempio (copiato da ActiveState http://code.activestate.com/recipes/81330-single-pass-multiple-replace/)
import re
def multiple_replace(dict, text):
# Create a regular expression from the dictionary keys
regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))
# For each match, look-up corresponding value in dictionary
return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text)
if __name__ == "__main__":
text = "Larry Wall is the creator of Perl"
dict = {
"Larry Wall" : "Guido van Rossum",
"creator" : "Benevolent Dictator for Life",
"Perl" : "Python",
}
print multiple_replace(dict, text)
Quindi nel tuo caso, si potrebbe fare un dict trans = {"a": "aa", "b": "bb"}
e poi passarlo in multiple_replace
insieme al testo vuoi tradotto. Fondamentalmente tutto ciò che sta facendo è la creazione di un'enorme regex contenente tutte le espressioni regolari da tradurre, quindi quando ne viene trovata una, passa una funzione lambda a regex.sub
per eseguire la ricerca del dizionario di traduzione.
È possibile utilizzare questa funzione durante la lettura dal file, ad esempio:
with open("notes.txt") as text:
new_text = multiple_replace(replacements, text.read())
with open("notes2.txt", "w") as result:
result.write(new_text)
realtà ho usato questo metodo esatto in produzione, in un caso in cui avevo bisogno di tradurre i mesi dell'anno da Ceco in inglese per un'attività di scraping web.
Come @nhahtdh sottolineato, uno svantaggio di questo approccio è che non è prefisso: Avviso e-chiavi del dizionario che sono prefissi di altri tasti del dizionario farà sì che il metodo di rottura.
Wow, grazie, è più o meno quello che stavo cercando. Ho ancora una domanda di base, come posso ignorare le lettere maiuscole? Quindi se avessi A e volessi anche tradurlo in aa senza aggiungerlo al dizionario. – Euridice01
@ Euridice01: se si desidera ignorare il caso, specificare il flag 're.I' in' re.compile'. – nhahtdh
La tua soluzione attuale non è ancora configurata per il caso d'uso in cui esiste una coppia di parole, una delle quali è il prefisso dell'altra. L'ordine di apparizione nella materia di alternanza. Penso che almeno dovresti affermare questa ipotesi. – nhahtdh