Команды замены текста в 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> & текстВажно: порядок замен имеет значение. Если заменить "&" раньше, чем "<", то все амперсанды уже будут экранированы, и последующая замена "<" не затронет уже экранированный амперсанд. Рекомендуется сначала заменять более длинные подстроки или использовать 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 TestHello 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
EnPython команда заменить (python)