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

Метод replace() заменяет в строке Python все вхождения подстроки и возвращает новую строку, а исходная остаётся прежней.

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

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3017 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3671 экспертное мнение Подписаться на Телеграм-канал
Обложка: Метод replace() в Python: как заменить символ или подстроку в строке

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

Третий аргумент ограничивает число замен, пустая строка вместо нового значения удаляет символ. Для замены без учёта регистра, по шаблону или сразу нескольких символов есть re.sub() и translate(), ниже разобран каждый способ, у всех примеров есть вывод интерпретатора. Остальные методы строк собраны в шпаргалке по 15 методам.

CheckroiCheckroiПодборка курсов по Python568 курсов • 51 школаСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Синтаксис 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() лучше передавать по имени. Позиционная запись объявлена устаревшей, в будущих версиях они станут только именованными.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

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-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология145 100 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox122 226 ₽4108 ₽/мес.9 месяцевОбзор курса
Программирование на Python ПРО
Перейти на сайт курса
SkillboxSkillbox119 600 ₽ - 17 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Что делает replace() в Python?

Метод находит в строке все вхождения подстроки и возвращает новую строку, где они заменены: "кот и кот".replace("кот", "пёс") даёт 'пёс и пёс'. Исходная строка остаётся прежней, потому что строки в Python неизменяемые.

Почему replace() не меняет строку?

Метод возвращает копию, а не правит строку на месте. Результат нужно присвоить переменной: s = s.replace("a", "b"). Без присваивания новая строка теряется, и в переменной остаётся старый текст.

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

Напрямую s[0] = "X" не сработает, будет TypeError. Соберите новую строку из срезов: s[:i] + "X" + s[i+1:]. Если менять нужно несколько позиций, переведите строку в список через list(s), поменяйте элементы и склейте через "".join().

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

Для одиночных символов подходит translate() с таблицей из str.maketrans(), она же удаляет символы третьим аргументом. Для слов надёжнее один проход re.sub() со словарём замен: цепочка replace() может заменить уже заменённый текст.

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

Метод replace() всегда различает регистр. Используйте re.sub() с флагом: re.sub("кот", "пёс", text, flags=re.IGNORECASE) заменит и «Кот», и «кот».

Как удалить символ из строки через replace()?

Передайте пустую строку вторым аргументом: "a,b,c".replace(",", "") вернёт 'abc'. Чтобы удалить много разных знаков, удобнее str.maketrans("", "", "!?.,") вместе с translate(). Остальные методы строк собраны в шпаргалке по методам строк Python.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!