Разделение строки с сохранением разделителей в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Эффективное решение данной задачи заключается в использовании функции re.split(), которая в связке с группами захвата (()) позволяет сохранить разделители. Такой подход делает ваш код аккуратным и легко читаемым.

Применение групп захвата для сохранения запятых может быть продемонстрировано следующим образом:

Python
Скопировать код
import re
result = re.split(r'(,)', 'one,two,three')
# Запятые остаются на своих местах, что и было нашей целью

Результат: ['one', ',', 'two', ',', 'three']

Наличие групп захвата в регулярном выражении указывает функции re.split(), что символы разделения необходимо включать в итоговый список.

Кинга Идем в IT: пошаговый план для смены профессии

Визуализация

Легко воспринимать разделение строки в Python можно, представив, что это процесс нарезки апельсина 🍊. Главное здесь сохранить кожуру на каждом ломтике.

Исходный текст:

Markdown
Скопировать код
"Ешь, Спи, Коди, Повторяй."

Результат нарезки:

Markdown
Скопировать код
["Ешь", ",", " Спи", ",", " Коди", ",", " Повторяй."]

Каждая запятая в списке как бы окружает слово, следующее за ней.

Рассмотрим следующий код:

Python
Скопировать код
import re
# На заметку: \W соответствует любому символу, не являющемуся буквой или цифрой
re.split(r'(\W)', 'Ешь, Спи, Коди, Повторяй.')

Визуализируем процесс:

Markdown
Скопировать код
До нарезки: 🍊
После нарезки: [🍊|, 🍊|, 🍊|, 🍊]

Каждый кусочек [🍊|] представляет собой часть строки с разделителем, и Python предоставляет этот удобный механизм для того, чтобы разбить строку, но при этом сохранить важные части.

Работа с не буквенно-цифровыми символами

Желали ли вы когда-нибудь сохранить сложные не буквенно-цифровые разделители? Теперь перед вами такая возможность:

Python
Скопировать код
result = re.split(r'([^a-zA-Z0-9])', 'Привет, Мир! 123')
# Python подбрасывает нам мячик: "Поймай их всех!" – выделяет любые такие символы

Вывод: ['Привет', ',', ' Мир', '!', ' 123']

Шаблон (([^a-zA-Z0-9])) говорит Python о том, что каждый символ, не являющийся буквой или цифрой, должен быть отделён и сохранён в ответном списке.

Отказ от использования регулярных выражений в пользу собственной функции

Если вы хотите обойтись без использования регулярных выражений, есть возможность создать собственную функцию, назвав её split_and_keep:

Python
Скопировать код
def split_and_keep(s, sep):
    # Здесь происходит магия
    parts = s.split(sep)
    return [sep.join(combination) for combination in zip(parts, [''] * (len(parts) – 1) + [sep])]

Очистка и обработка исключений

При использовании re.split() необходимо учесть, что:

  • В результате могут появиться пустые строки, если разделители находятся в начале или конце текста. Используйте метод strip() или списочное включение для их исключения.
  • При работе с символами Юникода и управляющими последовательностями в шаблоне следует быть внимательными, чтобы избежать возможных ошибок.

Когда важны только символы новой строки

Вы хотели бы сохранить только символы новой строки как разделители? В таком случае вам поможет метод splitlines() с аргументом keepends, заданным как True:

Python
Скопировать код
text = "Строка 1\nСтрока 2\nСтрока 3"
# Кто сказал, что нельзя сохранить \n, а затем разделить строки по этим символам?
lines = text.splitlines(True)

Вывод: ['Строка 1\n', 'Строка 2\n', 'Строка 3']

Соединение обратно частей строки

Если после разбиения строки вам необходимо собрать её вновь, то комбинация списковых выражений и методов работы со строками будет полезна:

Python
Скопировать код
segments = ['Это', ' ', 'пример', ' ', 'строки', '.']
assembled = ''.join(segments)  # Да, это работает!

И в итоге мы получаем полноценную строку: 'Это пример строки.' со всеми разделителями.

Полезные материалы

  1. Подробное руководство по работе с модулем re в Python для желающих освоить регулярные выражения: Python re Module – Use Regular Expressions with Python – Regex Support.
  2. Официальная документация Python по модулю re : re — Regular expression operations — Python 3.12.2 documentation.
  3. Regex101 — инструмент для создания, тестирования и визуализации регулярных выражений: Regex101: build, test, and debug regex.
  4. Tutorialspoint предлагает пошаговые примеры работы с модулем re в Python: Python – Regular Expressions.
  5. Справочник по методу split() для строк на сайте W3Schools: Python String split() Method.
  6. Pythex, онлайн-редактор для быстрого тестирования регулярных выражений: Pythex: a Python regular expression editor.
  7. Статья от Real Python с примерами использования метода split() в Python: Splitting, Concatenating, and Joining Strings in Python – Real Python.