replace() в Python: замена подстроки
Метод replace в Python: замена подстроки и символа, параметр count, удаление символов, несколько замен, translate, re.sub без учёта регистра и замена в файле.
Содержание · 12 разделов
- Синтаксис str.replace
- Замена всех вхождений
- Параметр count: заменить только первые вхождения
- Как заменить последнее вхождение
- Удаление символов и подстрок
- Несколько замен за один раз
- Цикл по словарю замен
- translate: замена отдельных символов
- Поменять два слова местами
- Замена без учёта регистра и по шаблону: re.sub
- Замена символа по индексу
- Замена в списке строк
- Замена текста в файле
- Частые ошибки
- Строка не изменилась после replace
- AttributeError: ‘list’ object has no attribute ‘replace’
- AttributeError: ‘int’ object has no attribute ‘replace’
- TypeError: replace() argument 2 must be str, not int
- Неожиданная замена части слова
- Частые вопросы
- Как убрать переводы строк из текста?
- Как заменить подстроку только в начале строки?
- Как заменить элемент в списке по значению?
- Как заменить разные символы на один?
- Как узнать, сколько замен было сделано?
- Итог
Метод replace() в Python заменяет все вхождения подстроки на другую строку и возвращает новую строку. Короткий ответ: "a-b-c".replace("-", "+") вернёт 'a+b+c', а третий аргумент ограничивает число замен: "a-b-c".replace("-", "+", 1) даст 'a+b-c'. Исходная строка не меняется, поэтому результат нужно присвоить переменной.
Ниже — синтаксис replace(), удаление символов, несколько замен сразу, замена без учёта регистра и по шаблону через re.sub(), замена в списке и в файле, а также типичные ошибки. Примеры проверены на Python 3.12.
Синтаксис str.replace
str.replace(old, new, count=-1)
old— что искать (подстрока любой длины).new— на что заменить. Пустая строка""означает удаление.count— сколько первых вхождений заменить. По умолчанию-1— все.
Метод ищет точное совпадение с учётом регистра. Если old в строке нет, возвращается копия исходной строки без ошибок.
Замена всех вхождений
text = "Я люблю Java. Java — мой первый язык."
new_text = text.replace("Java", "Python")
print(new_text) # → Я люблю Python. Python — мой первый язык.
print(text) # → Я люблю Java. Java — мой первый язык.
Строки в Python неизменяемы, поэтому text остался прежним: replace() создал новый объект. Подробнее об этом свойстве — в статье о строках в Python.
Параметр count: заменить только первые вхождения
s = "a-b-c-d"
print(s.replace("-", "+")) # → a+b+c+d
print(s.replace("-", "+", 1)) # → a+b-c-d
print(s.replace("-", "+", 2)) # → a+b+c-d
print(s.replace("x", "+")) # → a-b-c-d (нечего заменять)
Передавать count по имени (s.replace("-", "+", count=1)) можно с Python 3.13. В Python 3.12 и раньше count передаётся только позиционно, а такой вызов завершится ошибкой TypeError: str.replace() takes no keyword arguments. Аргументы old и new и в новых версиях передаются только позиционно.
Как заменить последнее вхождение
Параметра «с конца» у replace() нет. Разделите строку справа методом rsplit() и соберите обратно через join:
s = "a.b.c"
print("!".join(s.rsplit(".", 1))) # → a.b!c
Удаление символов и подстрок
Чтобы удалить символ или подстроку, замените их на пустую строку. Вызовы можно объединять в цепочку:
phone = "+7 (999) 123-45-67"
print(phone.replace(" ", "")) # → +7(999)123-45-67
digits = phone.replace(" ", "").replace("(", "").replace(")", "").replace("-", "")
print(digits) # → +79991234567
Пробелы только по краям строки удаляет strip(): replace() убрал бы и пробелы внутри. Подробнее — в статье о strip, lstrip и rstrip.
Несколько замен за один раз
Цикл по словарю замен
Когда замен много, держите их в словаре и применяйте по очереди:
text = "Мороз и солнце; день чудесный!"
replacements = {"Мороз": "Дождь", "солнце": "ветер", "чудесный": "унылый"}
for old, new in replacements.items():
text = text.replace(old, new)
print(text) # → Дождь и ветер; день унылый!
Замены выполняются последовательно, и каждая следующая работает с результатом предыдущей. О словарях — в статье о словарях Python.
translate: замена отдельных символов
Если нужно заменить или удалить много одиночных символов, метод translate() с таблицей str.maketrans() делает это за один проход:
table = str.maketrans({"а": "a", "о": "o", "е": "e"})
print("молоко и сено".translate(table)) # → мoлoкo и сeнo (кириллица → латиница)
table = str.maketrans("abc", "xyz", "!?") # a→x, b→y, c→z, удалить ! и ?
print("abc! cab?".translate(table)) # → xyz zxy
Третий аргумент maketrans() — символы, которые нужно удалить.
Поменять два слова местами
Цепочка replace() здесь ломается: после первой замены оба слова одинаковые.
s = "кошка и собака"
print(s.replace("кошка", "собака").replace("собака", "кошка")) # → кошка и кошка
Правильно — заменить оба слова за один проход через re.sub() с функцией:
import re
s = "кошка и собака"
swap = {"кошка": "собака", "собака": "кошка"}
print(re.sub(r"кошка|собака", lambda m: swap[m.group()], s)) # → собака и кошка
Замена без учёта регистра и по шаблону: re.sub
str.replace() чувствителен к регистру и не понимает шаблонов. Для этого есть re.sub(pattern, repl, string, count=0, flags=0) из модуля re:
import re
print("Python python PYTHON".replace("python", "Go")) # → Python Go PYTHON
print(re.sub("python", "Go", "Python python PYTHON", flags=re.IGNORECASE)) # → Go Go Go
print(re.sub(r"\d", "#", "Карта 1234 5678")) # → Карта #### ####
print(re.sub(r"\s+", " ", "много пробелов\t\tи\nтабов")) # → много пробелов и табов
print(re.sub(r"(\d{2})\.(\d{2})\.(\d{4})", r"\3-\2-\1", "Дата: 09.10.2026")) # → Дата: 2026-10-09
print(re.sub(r"\d", "#", "1 2 3", count=2)) # → # # 3
Ещё одна задача, которую replace() не решает, — замена только целых слов. replace() заденет и часть другого слова, а граница слова \b в регулярном выражении — нет:
print("кот и котёнок".replace("кот", "пёс")) # → пёс и пёсёнок
print(re.sub(r"\bкот\b", "пёс", "кот и котёнок")) # → пёс и котёнок
Если задача решается обычным replace(), используйте его: он проще и быстрее регулярного выражения.
Замена символа по индексу
replace() ищет по значению, а не по позиции. Чтобы заменить символ на конкретном месте, соберите строку из срезов или используйте список символов:
s = "Python"
i = 0
print(s[:i] + "J" + s[i + 1:]) # → Jython
chars = list(s)
chars[0] = "C"
print("".join(chars)) # → Cython
Замена в списке строк
У списка нет метода replace() — примените его к каждому элементу в генераторе списка:
files = ["report 1.txt", "photo 2.jpg", "notes 3.txt"]
print([f.replace(" ", "_") for f in files])
# → ['report_1.txt', 'photo_2.jpg', 'notes_3.txt']
nums = ["1,5", "2,75", "3"]
print([float(n.replace(",", ".")) for n in nums]) # → [1.5, 2.75, 3.0]
Второй пример — частая задача: перед float() нужно заменить десятичную запятую на точку. Другие тонкости преобразования — в статье о преобразовании строки в число. Для таблиц pandas есть свои методы: df["col"].str.replace(...) для строк в столбце и df.replace(...) для значений — см. обзор библиотеки pandas.
Замена текста в файле
Прочитайте файл целиком, замените текст и запишите обратно:
from pathlib import Path
path = Path("config.txt")
text = path.read_text(encoding="utf-8")
text = text.replace("DEBUG=True", "DEBUG=False")
path.write_text(text, encoding="utf-8")
Файл перезаписывается полностью, поэтому перед массовыми заменами сделайте резервную копию. Для очень больших файлов читайте и пишите построчно в новый файл.
Частые ошибки
Строка не изменилась после replace
s = "hello"
s.replace("h", "H")
print(s) # → hello
s = s.replace("h", "H")
print(s) # → Hello
Самая частая ошибка: результат replace() не сохранили. Метод не меняет строку на месте.
AttributeError: ‘list’ object has no attribute ‘replace’
replace() вызван у списка — например, у результата split() или readlines(). Замените в каждом элементе через генератор списка (см. раздел выше) или сначала соберите строку через join().
AttributeError: ‘int’ object has no attribute ‘replace’
У чисел нет строковых методов. Преобразуйте число в строку и, если нужно, обратно: int(str(1234).replace("1", "9")) вернёт 9234.
TypeError: replace() argument 2 must be str, not int
Оба аргумента должны быть строками: "abc".replace("a", 1) падает, "abc".replace("a", str(1)) вернёт '1bc'.
Неожиданная замена части слова
replace("кот", "пёс") превращает «котёнок» в «пёсёнок». Для целых слов используйте re.sub(r"\bкот\b", ...). А replace("", "-") с пустой подстрокой вставляет новую строку между всеми символами: "abc" превратится в '-a-b-c-'.
Разбор других исключений — в статье о traceback и ошибках Python.
Частые вопросы
Как убрать переводы строк из текста?
Замените \n на пробел или пустую строку. В текстах из Windows строки разделяет пара \r\n, поэтому сначала замените её. Другой вариант — разбить текст через splitlines() и собрать обратно:
text = "первая\r\nвторая\nтретья"
print(text.replace("\r\n", "\n").replace("\n", " ")) # → первая вторая третья
print(" ".join(text.splitlines())) # → первая вторая третья
Как заменить подстроку только в начале строки?
replace(old, new, 1) заменит первое вхождение, даже если оно в середине строки. Привязать замену к началу помогает якорь ^ в re.sub():
import re
print(re.sub(r"^http:", "https:", "http://example.com/http:")) # → https://example.com/http:
Если префикс нужно просто удалить, используйте removeprefix() (Python 3.9+).
Как заменить элемент в списке по значению?
replace() работает со строками. Для списка постройте новый список с условным выражением:
statuses = ["new", "done", "new"]
print(["open" if s == "new" else s for s in statuses]) # → ['open', 'done', 'open']
Как заменить разные символы на один?
Перечислите символы в квадратных скобках регулярного выражения — re.sub() заменит любой из них:
import re
print(re.sub(r"[,;:]", " ", "a,b;c:d")) # → a b c d
Как узнать, сколько замен было сделано?
replace() возвращает только строку. Число вхождений заранее даёт s.count(old), а re.subn() возвращает кортеж из новой строки и количества замен:
import re
result, n = re.subn(r"\d", "#", "Карта 1234")
print(result, n) # → Карта #### 4
Итог
str.replace(old, new, count) заменяет подстроку и возвращает новую строку — не забывайте присваивать результат. Для удаления передавайте пустую строку, для набора одиночных символов используйте translate(), а для регистра, шаблонов и целых слов — re.sub(). Другие методы строк собраны в статье о строках в Python и в шпаргалке по синтаксису Python.
- #Python
- #replace
- #Строки
- #Синтаксис