Множественная замена подстрок в Python: метод .replace
Быстрый ответ
Для эффективной замены нескольких подстрок используйте словарь и метод replace
следующим образом:
zamena = {'яблоко': 'апельсин', 'банан': 'ягода'}
tekst = "яблоко и банан"
for stary, novy in zamena.items():
tekst = tekst.replace(stary, novy)
print(tekst) # Вывод: апельсин и ягода
В этом цикле ваша строка преобразуется поочередно, подставляя пары из словаря.
Regex на помощь
Для выполнения сложных или обширных замен можно использовать модуль re:
import re
zamena = {'яблоко': 'апельсин', 'банан': 'ягода'}
pattern = re.compile("|".join(re.escape(key) for key in zamena))
tekst = "яблоко и банан в саду яблок"
tekst = pattern.sub(lambda match: zamena[match.group(0)], tekst)
print(tekst) # Вывод: апельсин и ягода в саду апельсин
Создание единого регулярного выражения с помощью re.compile
позволяет сразу заменить все совпавшие элементы, что более эффективно.
Многострочность и упорядоченные замены
Для многострочных текстов используйте флаг re.DOTALL
. Если порядок замен важен, отсортируйте ключи по убыванию длины, чтобы предотвратить нежелательные замены внутри длинных ключей:
pattern = re.compile("|".join(sorted(re.escape(key) for key in zamena, key=len, reverse=True)), re.DOTALL)
Оптимизация для больших данных
Обработка больших объемов данных может быть оптимизирована путем однократной компиляции шаблона и его многократного применения:
def multiple_replace(tekst, zamena):
pattern = re.compile("|".join(sorted(re.escape(k) for k in zamena, key=len, reverse=True)), re.DOTALL)
return pattern.sub(lambda m: zamena[m.group(0)], tekst)
tekst = "яблоко и банан в саду яблок"
print(multiple_replace(tekst, {'яблоко': 'апельсин', 'банан': 'ягода'}))
Визуализация
Продемонстрируем это на примере скрытия email-адресов:
Исходная строка: "Свяжитесь с нами по адресу info@example.com или support@example.org"
После замены:
import re
tekst = "Свяжитесь с нами по адресу info@example.com или support@example.org"
pattern = re.compile(r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b")
tekst = pattern.sub("***@***.com", tekst)
print(tekst) # Вывод: Свяжитесь с нами по адресу ***@***.com или ***@***.com
Теперь email-адреса скрыты в соответствии с GDPR 👏
Полезные материалы
- Метод replace() строк в Python
- Какой самый эффективный способ заменить несколько символов в строке? – Stack Overflow
- re — Операции с регулярными выражениями — Документация Python 3.12.1
- 5. Структуры данных — Документация Python 3.12.1
- Методы строк в Python | Programiz
- Лямбда-функции в Python – GeeksforGeeks