Чтобы заменить символ или кусок текста в строке Python, вызовите метод replace(): text.replace("старое", "новое"). Он находит все вхождения подстроки и возвращает новую строку, а исходная остаётся прежней. Поэтому результат сохраняют в переменную: text = text.replace(",", ".").
Третий аргумент ограничивает число замен, пустая строка вместо нового значения удаляет символ. Для замены без учёта регистра, по шаблону или сразу нескольких символов есть re.sub() и translate(), ниже разобран каждый способ, у всех примеров есть вывод интерпретатора. Остальные методы строк собраны в шпаргалке по 15 методам.
Синтаксис replace() и что он возвращает

Полная запись метода выглядит так:
str.replace(old, new, count=-1)| Аргумент | Что это | Обязательный |
|---|---|---|
old |
подстрока, которую ищем | да |
new |
на что меняем; пустая строка "" удаляет найденное |
да |
count |
сколько вхождений заменить, считая слева; по умолчанию -1, то есть все |
нет |
В документации Python метод описан как возврат копии строки, в которой все вхождения old заменены на new. Ключевое слово здесь «копия»: строки в Python неизменяемые, поэтому replace() исходник не трогает.
s = "Привет, мир"
print(s.replace("мир", "Python"))
print(s)
Привет, Python
Привет, мир
Если подстроки в тексте нет, метод вернёт строку без изменений и не выдаст ошибку. В цикле это удобно, только опечатки так не заметить: "abc".replace("x", "y") спокойно отдаст 'abc'.
Как заменить символ в строке
Самая частая задача: поменять один символ на другой во всём тексте. Например, превратить десятичную запятую в точку, чтобы число из ввода прочиталось без ошибки:
raw = "3,14"
print(float(raw.replace(",", ".")))
float(raw)
3.14
ValueError: could not convert string to float: '3,14'
Удалить символ из строки
Чтобы убрать символ, передайте пустую строку вторым аргументом. Вызовы можно ставить цепочкой, и каждый следующий работает с результатом предыдущего:
phone = "8 (999) 123-45-67"
digits = phone.replace(" ", "").replace("(", "").replace(")", "").replace("-", "")
print(digits)
89991234567
Цепочка из четырёх вызовов ещё читается. Если удалять нужно десяток разных знаков, удобнее translate(), о нём ниже.
Заменить перенос строки или путь
Спецсимволы меняются так же, как обычные буквы. Перенос \n превращается в пробел, обратный слеш в пути Windows пишут удвоенным:
print(repr("строка 1\nстрока 2".replace("\n", " ")))
print("C:\\Users\\anna".replace("\\", "/"))
'строка 1 строка 2'
C:/Users/anna
Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединитьсяКак ограничить число замен через count
Третий аргумент говорит, сколько первых вхождений заменить. Счёт идёт слева направо:
t = "кот, кот, кот"
print(t.replace("кот", "пёс", 2))
print(t.replace("кот", "пёс", 0))
print(t.replace("кот", "пёс", -1))
пёс, пёс, кот
кот, кот, кот
пёс, пёс, пёс
Ноль не заменяет ничего, а -1 работает как вызов без аргумента. С Python 3.13 count можно передать по имени: "aaa".replace("a", "b", count=2) вернёт 'bba'. В более старых версиях такая запись падает с ошибкой, там аргумент передают только по позиции.
Заменить последнее вхождение replace() не умеет. Тут помогает обходной путь: разрезать строку справа один раз и склеить обратно.
u = "a-b-c-d"
print("_".join(u.rsplit("-", 1)))
a-b-c_d
Как заменить символ по индексу
Присвоить букве новое значение напрямую не получится, Python сообщит, что строка такого не поддерживает:
w = "питон"
w[0] = "П"
TypeError: 'str' object does not support item assignment
Есть два рабочих способа. Срез собирает новую строку из кусков старой, а список позволяет менять символы по одному и потом склеить их через join():
w = "питон"
print(w[:0] + "П" + w[1:])
chars = list(w)
chars[2] = "Т"
print("".join(chars))
Питон
пиТон
Срез удобен для одной замены, а список выручает, когда символов несколько и стоят они в разных местах. Как превратить строку в список и обратно, подробно показано в разборе split() и list().
Как сделать несколько замен сразу

Когда пар «старое → новое» много, их собирают в словарь и проходят циклом. Но у цикла есть ловушка: каждая замена работает с уже изменённым текстом.
repl = {"мышь": "кошка", "кошка": "собака"}
text = "кошка ловит мышь"
for old, new in repl.items():
text = text.replace(old, new)
print(text)
собака ловит собака
Сначала «мышь» стала «кошкой», а потом обе кошки превратились в собак. Чтобы замены не задевали друг друга, их делают за один проход регулярным выражением:
import re
pattern = re.compile("|".join(map(re.escape, repl)))
print(pattern.sub(lambda m: repl[m.group(0)], "кошка ловит мышь"))
собака ловит кошка
re.escape() здесь нужен, чтобы точки, скобки и другие спецсимволы в ключах словаря искались как обычный текст.
translate() для одиночных символов
Если меняются отдельные символы, а не слова, короче записать это через translate(). Таблицу для него строит str.maketrans(): словарь «символ → замена» или третий аргумент со списком символов на удаление.
table = str.maketrans({"а": "a", "о": "o", "е": "e"})
print("молоко и сено".translate(table))
no_punct = str.maketrans("", "", "!?.,")
print("Привет!!! Как дела?".translate(no_punct))
мoлoкo и сeнo
Привет Как дела
В первой строке кириллические «а», «о» и «е» заменены латинскими двойниками, и на глаз разницы не видно. Пригодится, если нужно проверить, замечает ли ваш код подмену букв. На такой же таблице можно построить шифр Цезаря: каждая буква алфавита в ней заменена буквой со сдвигом. Как устроены таблицы перевода, описано в справке по translate().
Замена по шаблону и без учёта регистра через модуль re
replace() сравнивает текст буквально и различает регистр. Всё, что сложнее, делает re.sub() из модуля re. Синтаксис: re.sub(шаблон, замена, строка, count=0, flags=0).
| Задача | Код | Результат |
|---|---|---|
| без учёта регистра | re.sub("кот", "пёс", "Кот и кот", flags=re.IGNORECASE) |
пёс и пёс |
| все цифры | re.sub(r"\d", "*", "Карта 4276 1234") |
Карта **** **** |
| лишние пробелы и переносы | re.sub(r"\s+", " ", "много пробелов\tи\nпереносов") |
много пробелов и переносов |
| только целое слово | re.sub(r"\bкот\b", "пёс", "кот котлета") |
пёс котлета |
| перестановка групп | re.sub(r"(\d{4}) (\d{4})", r"\1-\2", "4276 1234") |
4276-1234 |
Обычный replace() на той же строке с «котлетой» ошибается: "кот котлета".replace("кот", "пёс") даёт 'пёс пёслета'. Граница слова \b в шаблоне такую подмену исключает.
Если нужно знать, сколько замен случилось, берите re.subn(): он возвращает кортеж из новой строки и числа замен, например ('a#b##', 3) для re.subn(r"\d", "#", "a1b22"). Синтаксис шаблонов разобран в статье про регулярные выражения в Python, а все параметры функции перечислены в документации модуля re.
С Python 3.13 аргументы
countиflagsуre.sub()лучше передавать по имени. Позиционная запись объявлена устаревшей, в будущих версиях они станут только именованными.
replace() в списке, числе и файле
Метод есть только у строк. Для других данных сначала нужна строка, а потом уже замена.
В списке строк
Пройтись по элементам удобно генератором списка. Для замены целого элемента подойдёт тернарный оператор внутри него:
items = ["1,5", "2,75", "10"]
print([x.replace(",", ".") for x in items])
fruits = ["яблоко", "груша", "яблоко"]
print([("слива" if x == "яблоко" else x) for x in fruits])
['1.5', '2.75', '10']
['слива', 'груша', 'слива']
В числе
У целого числа метода replace() нет, вызов закончится ошибкой AttributeError: 'int' object has no attribute 'replace'. Число переводят в строку и обратно, если нужно:
n = 1234
print(str(n).replace("3", "9"))
1294
В файле
Файл читают целиком, меняют текст и записывают обратно. Так, например, чинят CSV, где дробная часть отделена запятой:
with open("prices.csv", encoding="utf-8") as f:
text = f.read()
text = text.replace(",", ".")
with open("prices.csv", "w", encoding="utf-8") as f:
f.write(text)
Было Москва;1,5, стало Москва;1.5. Режимы открытия и кодировки описаны в инструкции как открыть файл в Python. Перед заменой в рабочем файле сделайте копию: запись в режиме "w" стирает старое содержимое.
Три практические задачи на замену

Синтаксис запоминается быстрее, когда видишь его в деле. Вот три задачи, которые часто встречаются в учебных проектах и в работе с данными.
Скрыть номер карты
В логах и письмах номер карты показывают с последними четырьмя цифрами. Шаблон находит четыре группы цифр, но в скобки взята только последняя, её и подставляет ссылка \1:
import re
card = "Оплата картой 4276 1234 5678 9012 прошла"
print(re.sub(r"\d{4} \d{4} \d{4} (\d{4})", r"**** **** **** \1", card))
Оплата картой **** **** **** 9012 прошла
Заменить запрещённые слова звёздочками
Фильтр для комментариев должен ловить слово в любом регистре и не трогать слова, которые с него начинаются. Помогают флаг re.IGNORECASE и граница \b, а функция в замене ставит столько звёздочек, сколько букв в слове:
bad = ["дурак", "балбес"]
pattern = re.compile(r"\b(" + "|".join(map(re.escape, bad)) + r")\b", re.IGNORECASE)
print(pattern.sub(lambda m: "*" * len(m.group(0)), "Сам Дурак, а он балбесина"))
Сам *****, а он балбесина
«Балбесина» осталась целой. С обычным replace() её бы испортило, и «Дурак» с заглавной буквы фильтр бы пропустил.
Сделать адрес страницы из заголовка
Здесь работают сразу три инструмента: strip() убирает пробелы по краям, replace() удаляет вопросительный знак, а re.sub() превращает любые пробелы внутри в дефис.
title=" Как заменить символ в строке? "
slug = title.strip().lower().replace("?", "")
slug = re.sub(r"\s+", "-", slug)
print(slug)
как-заменить-символ-в-строке
Ещё больше упражнений на строки, списки и циклы собрано в 30 задачах по Python для начинающих.
Частые ошибки и что с ними делать
| Симптом | Причина | Что сделать |
|---|---|---|
| строка не изменилась | результат replace() никуда не сохранён |
присвоить: s = s.replace("a", "A") |
| заменилось внутри другого слова | replace() ищет подстроку, а не слово |
re.sub(r"\bслово\b", …) |
| часть замен «съехала» | цикл по словарю меняет уже заменённый текст | один проход через re.sub() с функцией |
TypeError: 'str' object does not support item assignment |
попытка присвоить символ по индексу | срез или список + join() |
AttributeError: 'int' object has no attribute 'replace' |
метод вызван у числа | str(n).replace(…) |
| исчезли пробелы между словами | replace(" ", "") удаляет все пробелы, а не только по краям |
для краёв строки нужен strip() |
| между всеми буквами появился символ | первый аргумент пустой: "abc".replace("", "-") даёт '-a-b-c-' |
проверить, что old не пустая строка |
Первая ошибка встречается чаще остальных. В коде вроде такого всё выглядит правильно, но имя не меняется:
name = "anna"
name.replace("a", "A")
print(name)
name = name.replace("a", "A")
print(name)
anna
AnnA
Какой способ выбрать
| Задача | Инструмент |
|---|---|
| заменить или удалить подстроку | replace() |
| только первые N вхождений | replace(old, new, N) |
| последнее вхождение | rsplit(old, 1) + join() |
| символ на конкретной позиции | срез или список |
| много одиночных символов | str.maketrans() + translate() |
| несколько слов по словарю | re.sub() с функцией |
| без учёта регистра, по шаблону, целое слово | re.sub() |
Для повседневной обработки текста хватает replace(): он короткий, читается без пояснений и не требует импорта. К регулярным выражениям стоит переходить, когда буквального совпадения мало. Если код со строками стал запутанным, загляните в разбор модуля re: там видно, где шаблон короче цепочки замен.
Где освоить Python системно
Замена в строке решается одной строкой кода, но в реальном проекте за ней стоят чтение файлов, регулярные выражения и обработка данных. Эти темы проходят в начале любого курса по Python, а дальше к ним добавляются функции, классы и работа с библиотеками.
Ниже курсы из каталога по Python с ценами и отзывами. Если хотите сменить работу, посмотрите программы по профессии Python-разработчик.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 145 100 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 122 226 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | - | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




