Django-Admin.ru

replace() в Python: замена подстроки

Метод replace в Python: замена подстроки и символа, параметр count, удаление символов, несколько замен, translate, re.sub без учёта регистра и замена в файле.

Редакция Django-Admin.ru
· обновлено · 8 мин чтения

Содержание · 12 разделов
  1. Синтаксис str.replace
  2. Замена всех вхождений
  3. Параметр count: заменить только первые вхождения
  4. Как заменить последнее вхождение
  5. Удаление символов и подстрок
  6. Несколько замен за один раз
  7. Цикл по словарю замен
  8. translate: замена отдельных символов
  9. Поменять два слова местами
  10. Замена без учёта регистра и по шаблону: re.sub
  11. Замена символа по индексу
  12. Замена в списке строк
  13. Замена текста в файле
  14. Частые ошибки
  15. Строка не изменилась после replace
  16. AttributeError: ‘list’ object has no attribute ‘replace’
  17. AttributeError: ‘int’ object has no attribute ‘replace’
  18. TypeError: replace() argument 2 must be str, not int
  19. Неожиданная замена части слова
  20. Частые вопросы
  21. Как убрать переводы строк из текста?
  22. Как заменить подстроку только в начале строки?
  23. Как заменить элемент в списке по значению?
  24. Как заменить разные символы на один?
  25. Как узнать, сколько замен было сделано?
  26. Итог

Метод 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
  • #Строки
  • #Синтаксис
↑ ↓ выборEnter открытьEsc закрыть