J'ai construit ce moment de F. J. s excellente réponse:
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)
Un tir d'utilisation:
>>> 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é.
Notez que depuis le remplacement est effectué en une seule passe, "café" modifications "thé", mais il n'est pas à nouveau "café".
Si vous avez besoin de faire le remplacement de nombreuses fois, vous pouvez créer une fonction de remplacement facilement:
>>> 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!\"
Améliorations:
- tourné code dans une fonction
- ajouté soutien multiligne
- correction d'un bug à s'échapper
- facile de créer une fonction spécifique à un multiple de remplacement
Profitez-en! :-)