Модуль 5 · Строки

Справочник по Python · модуль 5 · строки

Глава 5.10

5.10

Замена, разбиение
и преобразование строк

replace() заменяет подстроки, split() превращает строку в список частей, splitlines() понимает границы строк, а upper(), swapcase() и zfill() создают новое представление текста. Это последняя группа строковых методов и самая используемая на практике.

Категория
Строковые методы
Уровень
Базовый → средний
Связанные темы
Списки, строки, форматирование
Зачем это знать
Нормализовать ввод и разбирать текстовые записи

§1replace(): все вхождения

replace(old, new) возвращает строку, где каждое вхождение подстроки заменено на другую.

main.pyтри вхождения сразу
text = "кот, кот и ещё кот"
updated = text.replace("кот", "пёс")

print(text)
print(updated)
Выводисходная строка не изменилась
кот, кот и ещё кот
пёс, пёс и ещё пёс

По умолчанию заменяются все вхождения — этим метод отличается от remove() у списков из главы 3.10, который убирал только первое. Если подстрока не найдена, возвращается копия исходной строки без ошибки.

§2Ограничение числа замен

Третий аргумент задаёт максимальное количество замен, считая слева.

main.pyтолько первые два дефиса
date = "2026-09-06-extra"
print(date.replace("-", "/", 2))
Выводтретий дефис уцелел
2026/09/06-extra

Это нужно, когда одинаковые символы играют в строке разные роли: здесь первые два дефиса разделяют дату, а третий отделяет примечание.

§3Удаление через replace()

Если заменить подстроку на пустую строку, она просто исчезнет. Это стандартный способ удалить символы внутри строки — там, где strip() из главы 5.9 бессилен.

main.pyубрать все пробелы
phone = "+7 900 123 45 67"
print(phone.replace(" ", ""))
Выводномер собран в одну строку
+79001234567
ЗадачаМетод
убрать пробелы по краямstrip()
убрать все пробелыreplace(" ", "")
убрать слово с концаremovesuffix()

§4split(): строка в список

split(sep) разбивает строку по разделителю и возвращает список частей. Сам разделитель в результат не попадает.

main.pyзапись с точками с запятой
row = "Анна;;95"
print(row.split(";"))
Выводмежду разделителями пустое поле
['Анна', '', '95']

Пустая строка в середине — не ошибка, а точное отражение данных: между двумя точками с запятой действительно ничего нет. Для таблиц это правильное поведение, потому что число полей сохраняется.

§5split() без аргумента

Без аргумента метод ведёт себя иначе: он делит по сериям любых пробельных символов и отбрасывает пустые части по краям.

main.pyпробелы, табуляция и перевод строки вперемешку
text = "  Python\tдля\nвсех  "
print(text.split())
Выводровно три слова
['Python', 'для', 'всех']

Это готовый способ разбить текст на слова: не нужно ни очищать края, ни думать о двойных пробелах.

§6split() против split(" ")

Разница между вызовом без аргумента и с пробелом выглядит косметической, но поведение у них разное.

main.pyдвойной пробел в середине
text = "a b  c"

print(text.split())
print(text.split(" "))
Выводво втором случае появилась пустая часть
['a', 'b', 'c']
['a', 'b', '', 'c']
split()split(" ")
что считает разделителемсерию любых пробельныхровно один пробел
двойной пробелодин разделительдва, между ними пусто
табуляция и перевод строкитоже разделителиобычные символы
края строкипустые части отбрасываютсясохраняются

Практическое правило: разбиваете текст на слова — split() без аргумента; разбираете структурированную запись с фиксированными полями — явный разделитель.

§7Пустая строка

Та же разница проявляется на пустой строке, и это регулярно ломает обработку данных.

main.pyразбиваем пустую строку
print("".split())
print("".split(","))
Выводпустой список и список из пустой строки
[]
['']

Длина результатов разная — 0 и 1. Цикл по первому не выполнится ни разу, по второму выполнится один раз с пустым значением. Если данные приходят из файла, где встречаются пустые строки, эту разницу нужно учитывать явно.

§8maxsplit

Второй аргумент ограничивает число разбиений. Всё, что осталось, попадает в последний элемент целиком.

main.pyв сообщении тоже есть двоеточия
record = "INFO:2026-09-06:Сервер запущен"
print(record.split(":", 2))
Выводне больше трёх частей
['INFO', '2026-09-06', 'Сервер запущен']

Приём незаменим при разборе логов: уровень и дату нужно отделить, а текст сообщения — сохранить как есть, даже если в нём встретится разделитель.

§9rsplit()

rsplit() отсчитывает разбиения справа. Без maxsplit результат совпадает с split() — разница появляется только вместе с ограничением.

main.pyотделяем расширение
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() с переводом строки.

main.pyтекст заканчивается переводом строки
text = "первая\nвторая\n"

print(text.split("\n"))
print(text.splitlines())
Выводу split() появился лишний пустой элемент
['первая', 'вторая', '']
['первая', 'вторая']

Файлы почти всегда заканчиваются переводом строки, поэтому split("\n") регулярно даёт «лишнюю пустую строку в конце». splitlines() этой проблемы лишён — он понимает, что последний перевод завершает строку, а не начинает новую.

main.pyразные окончания строк вперемешку
text = "первая\nвторая\r\nтретья"
print(text.splitlines())
Выводоба вида окончаний распознаны
['первая', 'вторая', 'третья']

Второе преимущество: \r\n — окончание строк в Windows — распознаётся как одна граница. С split("\n") символ \r остался бы в конце каждой части и портил бы сравнения.

§11keepends

Если окончания строк нужно сохранить, передают keepends=True.

main.pyrepr показывает управляющие символы
text = "первая\nвторая\n"
print(text.splitlines(keepends=True))
Выводпереводы строк вошли в элементы
['первая\n', 'вторая\n']

Это нужно, когда текст разбирают, что-то в нём меняют и собирают обратно: с сохранёнными окончаниями достаточно склеить части через "".join(), и исходное форматирование не пострадает.

§12Практика: разбор записи

split() вместе с распаковкой из главы 6.6 разбирает строку данных в одну строку кода.

main.pyстрока CSV в три переменные
csv_line = "Анна,25,Москва"
name, age, city = csv_line.split(",")

print(name)
print(city)
Выводполя разложены по именам
Анна
Москва
Распаковка требует точного числа полей

Если в записи окажется не три поля, а два или четыре, будет ValueError. Для данных из внешнего источника надёжнее сохранить результат в список и проверить его длину — либо задать maxsplit, чтобы число частей было предсказуемым.

И ещё одно: split(",") не понимает кавычек, поэтому значение вида "Москва, Россия" он разорвёт. Для настоящих CSV-файлов есть модуль csv — он разбирается в модуле 8.

§13upper(), swapcase(), title()

К методам регистра из главы 5.2 добавляются ещё три.

main.pyтри преобразования одной строки
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.

main.pyчисло, знак и слишком длинная строка
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() дополняет нулями, аккуратно обходясь со знаком числа.

Глава 5.10 · Замена и разбиение строк · Справочник по Python Автор: Макаров Максим Николаевич