# use these three lines to do the replacement rep = dict((re.escape(k), v) for k, v in rep.iteritems()) #Python 3 renamed dict.iteritems to dict.items so use rep.items() for latest versions pattern = re.compile("|".join(rep.keys())) text = pattern.sub(lambda m: rep[re.escape(m.group(0))], text)
Например:
>>> pattern.sub(lambda m: rep[re.escape(m.group(0))], "(condition1) and --condition2--") '() and --text--'
Ответ 2
Вы могли бы просто создать красивую маленькую функцию цикла.
defreplace_all(text, dic): for i, j in dic.iteritems(): text = text.replace(i, j) return text
где text - полная строка, а dic - словарь — каждое определение представляет собой строку, которая заменит соответствие термину.
Примечание: в Python 3, iteritems() был заменен на items()
Осторожно: в словарях Python нет надежного порядка итерации. Это решение решает вашу проблему, только если:
порядок замен не имеет значения
при замене можно изменять результаты предыдущих замен
Обновление: Приведенное выше утверждение, касающееся порядка вставки, не применяется к версиям Python больше или равным 3.6, поскольку стандартные правила были изменены, чтобы использовать порядок вставки для итерации.
Например:
d = { "cat": "dog", "dog": "pig"} my_sentence = "This is my cat and this is my dog." replace_all(my_sentence, d) print(my_sentence)
Возможный вывод #1:
"Это моя свинья, а это моя свинья".
Возможный вывод # 2
"Это моя собака, а это моя свинья".
Одним из возможных исправлений является использование OrderedDict .
from collections import OrderedDict defreplace_all(text, dic): for i, j in dic.items(): text = text.replace(i, j) return text od = OrderedDict([("cat", "dog"), ("dog", "pig")]) my_sentence = "This is my cat and this is my dog." replace_all(my_sentence, od) print(my_sentence)
Вывод:
"This is my pig and this is my pig."
Осторожно # 2: неэффективно, если ваша text строка слишком большая или в словаре много пар.
Ответ 3
Почему бы не использовать одно подобное решение?
s = "The quick brown fox jumps over the lazy dog" for r in (("brown", "red"), ("lazy", "quick")): s = s.replace(*r)
#output will be: The quick red fox jumps over the quick dog
Ответ 4
Вот вариант первого решения с использованием reduce (импорт из functools), на случай, если вам нравится функциональность. :)
repls = {'hello' : 'goodbye', 'world' : 'earth'} s = 'hello, world' reduce(lambda a, kv: a.replace(*kv), repls.iteritems(), s)
еще лучшая версия martineau:
repls = ('hello', 'goodbye'), ('world', 'earth') s = 'hello, world' reduce(lambda a, kv: a.replace(*kv), repls, s)