Вопрос-Ответ

How to replace multiple substrings of a string?

Как заменить несколько подстрок строки?

Я хотел бы использовать функцию .replace для замены нескольких строк.

В настоящее время у меня есть

string.replace("condition1", "")

но хотелось бы иметь что-то вроде

string.replace("condition1", "").replace("condition2", "text")

хотя это не похоже на хороший синтаксис

как правильно это сделать? вроде как в grep / regex вы можете делать \1 и \2 заменять поля определенными строками поиска

Переведено автоматически
Ответ 1

Вот краткий пример, который должен помочь с регулярными выражениями:

import re

rep = {"condition1": "", "condition2": "text"} # define desired replacements here

# 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

Вы могли бы просто создать красивую маленькую функцию цикла.

def replace_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
def replace_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)
python