Ich habe dies auf der Grundlage von F.J.s ausgezeichneter Antwort getan:
import re
def multiple_replacer(*key_values):
replace_dict = dict(key_values)
replacement_function = lambda match: replace_dict[match.group(0)]
pattern = re.compile("|".join([re.escape(k) for k, v in key_values]), re.M)
return lambda string: pattern.sub(replacement_function, string)
def multiple_replace(string, *key_values):
return multiple_replacer(*key_values)(string)
Einmalige Verwendung:
>>> replacements = (u"café", u"tea"), (u"tea", u"café"), (u"like", u"love")
>>> print multiple_replace(u"Do you like café? No, I prefer tea.", *replacements)
Do you love tea? No, I prefer café.
Da die Ersetzung in nur einem Durchgang erfolgt, ändert sich "café" in "tea", aber nicht zurück in "café".
Wenn Sie dieselbe Ersetzung mehrmals vornehmen müssen, können Sie problemlos eine Ersetzungsfunktion erstellen:
>>> my_escaper = multiple_replacer(('"','\\"'), ('\t', '\\t'))
>>> many_many_strings = (u'This text will be escaped by "my_escaper"',
u'Does this work?\tYes it does',
u'And can we span\nmultiple lines?\t"Yes\twe\tcan!"')
>>> for line in many_many_strings:
... print my_escaper(line)
...
This text will be escaped by \"my_escaper\"
Does this work?\tYes it does
And can we span
multiple lines?\t\"Yes\twe\tcan!\"
Verbesserungen:
- Code in eine Funktion umgewandelt
- Unterstützung für mehrere Zeilen hinzugefügt
- Fehler beim Escaping behoben
- einfache Erstellung einer Funktion für eine bestimmte Mehrfachersetzung
Viel Spaß! :-)
2 Stimmen
Ich habe mir die Zeit genommen, alle Antworten in verschiedenen Szenarien zu testen. Siehe stackoverflow.com/questions/59072514/
4 Stimmen
Die kurze Antwort lautet: Es gibt keinen besseren Weg, dies zu tun.