split() в Python: разбиение строки по разделителю
Метод split() в Python делит строку на части по разделителю и возвращает список подстрок. В статье разобраны параметры sep и maxsplit, разница между вызовом без аргументов и с пробелом, а также альтернативы: rsplit(), splitlines(), partition() и re.split() для нескольких разделителей сразу.

Содержание статьи
Синтаксис и параметры
Метод вызывается у строки и принимает два необязательных параметра, их можно передавать по имени:
str.split(sep=None, maxsplit=-1)sep- разделитель. Может состоять из нескольких символов. Если не указан, строка делится по пробельным символам.maxsplit- максимальное число разрезов. Значение -1 (по умолчанию) снимает ограничение.
Результат всегда список строк. Исходная строка не меняется, потому что строки неизменяемы.
text = "Python is a fun programming language"
words = text.split()
print(words) # ['Python', 'is', 'a', 'fun', 'programming', 'language']
print(len(words)) # 6Разделение по пробелам
Вызов без аргументов и вызов с пробелом в качестве разделителя выглядят похоже, но работают по-разному. Это самая частая причина неожиданных пустых строк в результате.
s = " a b c "
print(s.split()) # ['a', 'b', 'c']
print(s.split(" ")) # ['', '', 'a', '', 'b', 'c', '']Без аргументов split считает разделителем любую последовательность пробельных символов: пробелов, табуляций, переводов строки. Пробелы по краям при этом отбрасываются, пустых элементов не бывает. С явным разделителем " " каждый пробел режет строку отдельно, и между соседними пробелами появляется пустая строка.
| Вызов | Пустые элементы | Края строки | Табуляция и \n |
|---|---|---|---|
split() | Не появляются | Очищаются | Считаются разделителем |
split(" ") | Появляются | Дают пустые строки | Не считаются разделителем |
Для разбора текста на слова почти всегда нужен вариант без аргументов.
Свой разделитель
В sep можно передать любой символ или строку. Разделитель целиком исчезает из результата.
grocery = "Milk, Chicken, Bread"
print(grocery.split(", ")) # ['Milk', 'Chicken', 'Bread']
print(grocery.split(":")) # ['Milk, Chicken, Bread']
date = "2025-03-15"
year, month, day = date.split("-")
print(year, month, day) # 2025 03 15Если разделитель не встречается, возвращается список из одной исходной строки. Распаковка в переменные удобна, но при другом количестве частей вызовет ValueError, поэтому применяйте ее только к данным с известным форматом.
Пустые строки при явном разделителе
Два разделителя подряд или разделитель на краю дают пустой элемент. Это полезно для CSV-подобных данных, где пустое поле означает отсутствие значения.
print("a,,b,".split(",")) # ['a', '', 'b', '']
print("".split(",")) # ['']
print("".split()) # []Если пустые элементы не нужны, отфильтруйте их: [x for x in s.split(",") if x]. Пробелы вокруг частей удобно убрать методом strip(): [x.strip() for x in s.split(",")].
Параметр maxsplit и метод rsplit
Параметр maxsplit ограничивает число разрезов. После последнего разреза остаток строки попадает в список целиком, вместе с оставшимися разделителями.
grocery = "Молоко, Курица, Хлеб, Масло"
print(grocery.split(", ", maxsplit=1)) # ['Молоко', 'Курица, Хлеб, Масло']
print(grocery.split(", ", maxsplit=2)) # ['Молоко', 'Курица', 'Хлеб, Масло']
print(grocery.split(", ", maxsplit=0)) # ['Молоко, Курица, Хлеб, Масло']Метод rsplit() принимает те же параметры, но режет строку справа налево. Разница видна только при заданном maxsplit. Типичная задача - отделить расширение файла, когда в имени несколько точек:
name, ext = "archive.tar.gz".rsplit(".", maxsplit=1)
print(name, ext) # archive.tar gzДругие способы разбить строку
Для некоторых задач у строк и стандартной библиотеки есть более подходящие инструменты.
splitlines для многострочного текста
Метод делит текст по переводам строк любого типа: \n, \r\n, \r. В отличие от split("\n"), он не оставляет пустой элемент после последнего перевода строки.
text = "line1\nline2\r\nline3\n"
print(text.splitlines()) # ['line1', 'line2', 'line3']partition для разделения на две части
Метод partition(sep) режет строку по первому вхождению и всегда возвращает кортеж из трех элементов: часть до разделителя, сам разделитель и часть после. Если разделителя нет, последние два элемента будут пустыми строками, поэтому распаковка не упадет.
key, _, value = "host=localhost=1".partition("=")
print(key, value) # host localhost=1re.split для нескольких разделителей
Обычный split принимает только один разделитель. Если в данных встречаются запятые, точки с запятой и пробелы вперемешку, используйте функцию re.split() из модуля re.
import re
print(re.split(r"[;,\s]+", "a; b,c d")) # ['a', 'b', 'c', 'd']Чтобы разбить строку на отдельные символы, split не нужен: достаточно вызвать list("abc"), результат ['a', 'b', 'c'].
Обратная операция и практика
Собрать список строк обратно в одну строку помогает метод join(), он вызывается у разделителя. Подробно он описан в статье про join.
parts = "2025-03-15".split("-")
print(".".join(reversed(parts))) # 15.03.2025Частая учебная задача - прочитать несколько чисел, введенных через пробел в одной строке. split делит ввод на строки, а map(int, ...) превращает их в числа.
a, b = map(int, input().split()) # ввод: 3 7
print(a + b) # 10Полное описание параметров есть в документации Python.
Частые вопросы
Ответы на вопросы, которые чаще всего возникают при работе с split.
Почему в результате split появились пустые строки?
Разделитель указан явно, и в строке есть два разделителя подряд или разделитель на краю. Вызовите split без аргументов, если делите по пробелам, или отфильтруйте пустые элементы.
Можно ли передать в split несколько разделителей?
Нет, параметр sep принимает одну строку. Для нескольких вариантов используйте re.split() с набором символов в квадратных скобках или заранее замените все разделители на один через replace().
Как разделить строку и сразу получить числа?
Примените int к каждому элементу: list(map(int, s.split())) или генератор [int(x) for x in s.split()].
Чем split отличается от rsplit?
Без maxsplit результаты одинаковые. С maxsplit split начинает резать слева, а rsplit справа, поэтому неразрезанный остаток оказывается в начале списка.