Команды замены текста в Python

Раздел: Основы Python -> Строки/замена

Основы замены строк

Наиболее эффективное и простое решение для замены подстроки в строке Python - встроенный метод str.replace(). Этот метод работает быстро и не требует подключения дополнительных модулей.

Как заменить одну подстроку на другую в строке?

Метод replace() заменяет все (или заданное количество) вхождения старой подстроки на новую. Синтаксис: str.replace(old, new[, count]).

text = "кот, котёнок, котик"
new_text = text.replace("кот", "пёс")
print(new_text)  # пёс, пёсёнок, пёсик

Python команда заменить (команда замены строк в python (replace))

пёс, пёсёнок, пёсик

Опциональный параметр count ограничивает количество замен. Если не указан, заменяются все вхождения.

text = "один, один, один"
res = text.replace("один", "раз", 2)
print(res)  # раз, раз, один

Типичная ошибка: забыть, что строки в Python неизменяемы. Метод replace() возвращает новую строку, а не изменяет исходную.

s = "abc"
s.replace("a", "z")
print(s)  # abc (ошибка: результат не сохранён)

Решение: присвоить результат переменной или использовать в выражении.

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

Для замены отдельных символов (или небольших строк) удобно использовать str.translate() в паре со статическим методом str.maketrans(). Этот подход быстрее replace() при большом количестве замен одного символа.

trans_table = str.maketrans({"а": "a", "б": "b", "в": "v"})
text = "абвгд"
new = text.translate(trans_table)
print(new)  # abvгд

Проблема: maketrans требует однозначного сопоставления символов (длина ключа и значения - один символ). Для замены подстрок этот метод не подходит.

Как заменить все совпадения с шаблоном (регулярные выражения)?

Модуль re предоставляет функцию re.sub() для замены по регулярному выражению. Это гибкое решение, когда замена зависит от контекста.

import re
text = "Цена: 123 руб., скидка: 45 руб."
result = re.sub(r"\d+", "XXX", text)
print(result)  # Цена: XXX руб., скидка: XXX руб.

Типичная ошибка: некорректное экранирование в шаблоне. Например, для замены точки как символа нужно писать r"\.", а не просто ".".

Как выполнить множественную замену из словаря?

Если нужно заменить несколько разных подстрок на соответствующие им значения, удобно использовать цикл с replace() или re.sub() с callback-функцией.

replacements = {"<": "<", ">": ">", "&": "&"}
text = "<div> & текст"
for old, new in replacements.items():
    text = text.replace(old, new)
print(text)  # <div> &amp; текст

Важно: порядок замен имеет значение. Если заменить "&" раньше, чем "<", то все амперсанды уже будут экранированы, и последующая замена "<" не затронет уже экранированный амперсанд. Рекомендуется сначала заменять более длинные подстроки или использовать re.sub с функцией.

Как сделать замену без учета регистра?

Метод replace() чувствителен к регистру. Для игнорирования регистра можно предварительно привести строку к одному регистру или использовать модуль re с флагом re.IGNORECASE.

import re
text = "Python, python, PYTHON"
result = re.sub(r"python", "Java", text, flags=re.IGNORECASE)
print(result)  # Java, Java, Java

Проблема: при использовании replace() с предварительным переводом в нижний регистр теряется исходный регистр заменённых фрагментов. Решение - функция замены внутри re.sub(), которая сохраняет исходный регистр (или нужный).

Дополнительные расширенные примеры замены строк в Python.

Замена с ограничением количества (count) и множественные вызовы

Пример
text = "раз раз раз раз"
# заменить только два первых вхождения
result = text.replace("раз", "два", 2)
print(result)  # два два раз раз
два два раз раз

Использование translate для удаления символов

Пример
# создать таблицу, где символы заменяются на None (удаление)
remove = str.maketrans("", "", "!@#")
text = "Hello! World@ Test#"
cleaned = text.translate(remove)
print(cleaned)  # Hello World Test
Hello World Test

re.sub с callback-функцией для динамической замены

Пример
import re
def replacer(match):
    word = match.group(0)
    return word.upper()

text = "маленькая буква и ЕЩЁ одна"
result = re.sub(r"[а-яёА-ЯЁ]+", replacer, text)
print(result)  # МАЛЕНЬКАЯ БУКВА И ЕЩЁ ОДНА
МАЛЕНЬКАЯ БУКВА И ЕЩЁ ОДНА

Замена с учётом границ слов (только целые слова)

Пример
import re
text = "кот, котёнок, котик"
# замена только целого слова "кот", но не "котёнок"
result = re.sub(r"\bкот\b", "пёс", text)
print(result)  # пёс, котёнок, котик
пёс, котёнок, котик

Замена с экранированием спецсимволов (re.escape)

Пример
import re
text = "Это стоит $100, а скидка 50%"
# заменить знак доллара на слово "доллар"
pattern = re.escape("$")
result = re.sub(pattern, "доллар", text)
print(result)  # Это стоит доллар100, а скидка 50%
Это стоит доллар100, а скидка 50%

Замена по словарю с помощью re.sub (без проблем с порядком)

Пример
import re
replacements = {"<": "<", ">": ">", "&": "&"}
# Создаём паттерн, объединяя ключи через | (сортируем по убыванию длины для корректности)
pattern = "|".join(re.escape(key) for key in sorted(replacements, key=len, reverse=True))
def repl(m):
    return replacements[m.group(0)]
text = "<div> & текст"
result = re.sub(pattern, repl, text)
print(result)  # 
& текст
& текст

Команда замены строк в Python (replace) - comments

En
Python команда заменить (python)