Справочник по Python · модуль 5 · строки
Глава 5.10
Замена, разбиение
и преобразование строк
replace() заменяет подстроки, split() превращает строку в список частей, splitlines() понимает границы строк, а upper(), swapcase() и zfill() создают новое представление текста. Это последняя группа строковых методов и самая используемая на практике.
- Категория
- Строковые методы
- Уровень
- Базовый → средний
- Связанные темы
- Списки, строки, форматирование
- Зачем это знать
- Нормализовать ввод и разбирать текстовые записи
§1replace(): все вхождения
replace(old, new) возвращает строку, где каждое вхождение подстроки заменено на другую.
text = "кот, кот и ещё кот" updated = text.replace("кот", "пёс") print(text) print(updated)
кот, кот и ещё кот пёс, пёс и ещё пёс
По умолчанию заменяются все вхождения — этим метод отличается от remove() у списков из главы 3.10, который убирал только первое. Если подстрока не найдена, возвращается копия исходной строки без ошибки.
§2Ограничение числа замен
Третий аргумент задаёт максимальное количество замен, считая слева.
date = "2026-09-06-extra" print(date.replace("-", "/", 2))
2026/09/06-extra
Это нужно, когда одинаковые символы играют в строке разные роли: здесь первые два дефиса разделяют дату, а третий отделяет примечание.
§3Удаление через replace()
Если заменить подстроку на пустую строку, она просто исчезнет. Это стандартный способ удалить символы внутри строки — там, где strip() из главы 5.9 бессилен.
phone = "+7 900 123 45 67" print(phone.replace(" ", ""))
+79001234567
| Задача | Метод |
|---|---|
| убрать пробелы по краям | strip() |
| убрать все пробелы | replace(" ", "") |
| убрать слово с конца | removesuffix() |
§4split(): строка в список
split(sep) разбивает строку по разделителю и возвращает список частей. Сам разделитель в результат не попадает.
row = "Анна;;95" print(row.split(";"))
['Анна', '', '95']
Пустая строка в середине — не ошибка, а точное отражение данных: между двумя точками с запятой действительно ничего нет. Для таблиц это правильное поведение, потому что число полей сохраняется.
§5split() без аргумента
Без аргумента метод ведёт себя иначе: он делит по сериям любых пробельных символов и отбрасывает пустые части по краям.
text = " Python\tдля\nвсех "
print(text.split())
['Python', 'для', 'всех']
Это готовый способ разбить текст на слова: не нужно ни очищать края, ни думать о двойных пробелах.
§6split() против split(" ")
Разница между вызовом без аргумента и с пробелом выглядит косметической, но поведение у них разное.
text = "a b c" print(text.split()) print(text.split(" "))
['a', 'b', 'c'] ['a', 'b', '', 'c']
split() | split(" ") | |
|---|---|---|
| что считает разделителем | серию любых пробельных | ровно один пробел |
| двойной пробел | один разделитель | два, между ними пусто |
| табуляция и перевод строки | тоже разделители | обычные символы |
| края строки | пустые части отбрасываются | сохраняются |
Практическое правило: разбиваете текст на слова — split() без аргумента; разбираете структурированную запись с фиксированными полями — явный разделитель.
§7Пустая строка
Та же разница проявляется на пустой строке, и это регулярно ломает обработку данных.
print("".split()) print("".split(","))
[] ['']
Длина результатов разная — 0 и 1. Цикл по первому не выполнится ни разу, по второму выполнится один раз с пустым значением. Если данные приходят из файла, где встречаются пустые строки, эту разницу нужно учитывать явно.
§8maxsplit
Второй аргумент ограничивает число разбиений. Всё, что осталось, попадает в последний элемент целиком.
record = "INFO:2026-09-06:Сервер запущен" print(record.split(":", 2))
['INFO', '2026-09-06', 'Сервер запущен']
Приём незаменим при разборе логов: уровень и дату нужно отделить, а текст сообщения — сохранить как есть, даже если в нём встретится разделитель.
§9rsplit()
rsplit() отсчитывает разбиения справа. Без maxsplit результат совпадает с split() — разница появляется только вместе с ограничением.
filename = "archive.report.final.txt" print(filename.split(".", 1)) print(filename.rsplit(".", 1))
['archive', 'report.final.txt'] ['archive.report.final', 'txt']
Логика та же, что у rfind() и rpartition() из глав 5.5 и 5.9: приставка r всегда означает «с конца».
§10splitlines() против split()
Для разбиения на строки есть отдельный метод, и он не равнозначен split() с переводом строки.
text = "первая\nвторая\n" print(text.split("\n")) print(text.splitlines())
['первая', 'вторая', ''] ['первая', 'вторая']
Файлы почти всегда заканчиваются переводом строки, поэтому split("\n") регулярно даёт «лишнюю пустую строку в конце». splitlines() этой проблемы лишён — он понимает, что последний перевод завершает строку, а не начинает новую.
text = "первая\nвторая\r\nтретья"
print(text.splitlines())
['первая', 'вторая', 'третья']
Второе преимущество: \r\n — окончание строк в Windows — распознаётся как одна граница. С split("\n") символ \r остался бы в конце каждой части и портил бы сравнения.
§11keepends
Если окончания строк нужно сохранить, передают keepends=True.
text = "первая\nвторая\n" print(text.splitlines(keepends=True))
['первая\n', 'вторая\n']
Это нужно, когда текст разбирают, что-то в нём меняют и собирают обратно: с сохранёнными окончаниями достаточно склеить части через "".join(), и исходное форматирование не пострадает.
§12Практика: разбор записи
split() вместе с распаковкой из главы 6.6 разбирает строку данных в одну строку кода.
csv_line = "Анна,25,Москва" name, age, city = csv_line.split(",") print(name) print(city)
Анна Москва
Если в записи окажется не три поля, а два или четыре, будет ValueError. Для данных из внешнего источника надёжнее сохранить результат в список и проверить его длину — либо задать maxsplit, чтобы число частей было предсказуемым.
И ещё одно: split(",") не понимает кавычек, поэтому значение вида "Москва, Россия" он разорвёт. Для настоящих CSV-файлов есть модуль csv — он разбирается в модуле 8.
§13upper(), swapcase(), title()
К методам регистра из главы 5.2 добавляются ещё три.
text = "Python для всех" print(text.upper()) print(text.swapcase()) print(text.title())
PYTHON ДЛЯ ВСЕХ pYTHON ДЛЯ ВСЕХ Python Для Всех
| Метод | Что делает | Парная проверка |
|---|---|---|
upper() | все буквы заглавные | isupper() |
lower() | все буквы строчные | islower() |
title() | каждое слово с заглавной | istitle() |
swapcase() | меняет регистр на противоположный | нет |
capitalize() | первая позиция заглавная | нет |
У title() те же особенности, что у istitle() из главы 5.8: словом считается любая группа букв, поэтому "o'brien" превратится в "O'Brien". И помните: swapcase() дважды подряд не всегда возвращает исходную строку — там, где регистр не взаимно однозначен, как у немецкой ß.
§14zfill()
zfill(width) дополняет строку нулями слева до нужной длины. Название — от zero fill.
print("42".zfill(5)) print("-42".zfill(5)) print("123456".zfill(5))
00042 -0042 123456
Метод специально умеет обращаться со знаком: он ставит нули после - или +, а не перед ним. Этим он отличается от rjust(5, "0") из главы 5.3, который сдвинул бы знак вправо и дал бы неверное 00-42.
Как и center(), метод не обрезает: если строка уже длиннее width, она возвращается целиком.
§15Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
text.replace(old, new) без сохранения | результат выброшен: строки неизменяемы | text = text.replace(old, new) |
text.split("") | ValueError: пустой разделитель | list(text) для списка символов |
text.split(" ") для любого пробела | табуляции не разделят, двойной пробел даст пустую часть | text.split() без аргумента |
text.split("\n") для строк файла | в конце появится лишний пустой элемент | text.splitlines() |
ждать от "".split(",") пустого списка | вернётся [''] — один пустой элемент | проверять строку до разбиения |
a, b, c = line.split(",") для чужих данных | ValueError при другом числе полей | сохранить в список и проверить длину |
split(",") для настоящего CSV | значение в кавычках с запятой разорвётся | модуль csv |
"-42".rjust(5, "0") | получится 00-42 | "-42".zfill(5) |
применять zfill() к числу | AttributeError: это метод строки | str(number).zfill(5) |
§16Проверьте себя
Сколько вхождений заменит replace(old, new)?
Все. Чтобы ограничить количество, передают третий аргумент.
Чем split() отличается от split(" ")?
split() делит по сериям любых пробельных символов и отбрасывает пустые края. split(" ") ищет каждый одиночный пробел, из-за чего двойной пробел даёт пустую часть.
Почему "".split() и "".split(",") дают разные результаты?
Первый возвращает пустой список, второй — список из одной пустой строки. Их длины 0 и 1, и цикл по ним поведёт себя по-разному.
Когда нужен rsplit()?
Когда число разбиений ограничено, а искать разделители нужно с конца — например, чтобы отделить расширение файла.
Почему для строк файла лучше splitlines()?
Он не создаёт лишний пустой элемент из завершающего перевода строки и распознаёт \r\n как одну границу.
Чем zfill(5) лучше rjust(5, "0") для чисел?
zfill() ставит нули после знака: -42 станет -0042, а не 00-42.
§17Шпаргалка
text.replace(old, new)text.replace(" ", "")text.split()text.split(",")text.split(":", 2)text.rsplit(".", 1)text.splitlines()str(n).zfill(5)Итог главы
replace() заменяет все вхождения, если не ограничить их третьим аргументом, и заменой на пустую строку удаляет символы внутри текста. У split() две разные повадки: без аргумента он режет по сериям пробельных символов и годится для разбиения на слова, с явным разделителем — сохраняет пустые поля и годится для структурированных записей. Для строк текста нужен splitlines(): он не оставляет лишнего пустого элемента в конце и понимает окончания строк Windows. zfill() дополняет нулями, аккуратно обходясь со знаком числа.