Разделение строки с сохранением разделителей в Python
Быстрый ответ
Эффективное решение данной задачи заключается в использовании функции re.split()
, которая в связке с группами захвата (()
) позволяет сохранить разделители. Такой подход делает ваш код аккуратным и легко читаемым.
Применение групп захвата для сохранения запятых может быть продемонстрировано следующим образом:
import re
result = re.split(r'(,)', 'one,two,three')
# Запятые остаются на своих местах, что и было нашей целью
Результат: ['one', ',', 'two', ',', 'three']
Наличие групп захвата в регулярном выражении указывает функции re.split()
, что символы разделения необходимо включать в итоговый список.
Визуализация
Легко воспринимать разделение строки в Python можно, представив, что это процесс нарезки апельсина 🍊. Главное здесь сохранить кожуру на каждом ломтике.
Исходный текст:
"Ешь, Спи, Коди, Повторяй."
Результат нарезки:
["Ешь", ",", " Спи", ",", " Коди", ",", " Повторяй."]
Каждая запятая в списке как бы окружает слово, следующее за ней.
Рассмотрим следующий код:
import re
# На заметку: \W соответствует любому символу, не являющемуся буквой или цифрой
re.split(r'(\W)', 'Ешь, Спи, Коди, Повторяй.')
Визуализируем процесс:
До нарезки: 🍊
После нарезки: [🍊|, 🍊|, 🍊|, 🍊]
Каждый кусочек [🍊|] представляет собой часть строки с разделителем, и Python предоставляет этот удобный механизм для того, чтобы разбить строку, но при этом сохранить важные части.
Работа с не буквенно-цифровыми символами
Желали ли вы когда-нибудь сохранить сложные не буквенно-цифровые разделители? Теперь перед вами такая возможность:
result = re.split(r'([^a-zA-Z0-9])', 'Привет, Мир! 123')
# Python подбрасывает нам мячик: "Поймай их всех!" – выделяет любые такие символы
Вывод: ['Привет', ',', ' Мир', '!', ' 123']
Шаблон (([^a-zA-Z0-9])
) говорит Python о том, что каждый символ, не являющийся буквой или цифрой, должен быть отделён и сохранён в ответном списке.
Отказ от использования регулярных выражений в пользу собственной функции
Если вы хотите обойтись без использования регулярных выражений, есть возможность создать собственную функцию, назвав её split_and_keep
:
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
:
text = "Строка 1\nСтрока 2\nСтрока 3"
# Кто сказал, что нельзя сохранить \n, а затем разделить строки по этим символам?
lines = text.splitlines(True)
Вывод: ['Строка 1\n', 'Строка 2\n', 'Строка 3']
Соединение обратно частей строки
Если после разбиения строки вам необходимо собрать её вновь, то комбинация списковых выражений и методов работы со строками будет полезна:
segments = ['Это', ' ', 'пример', ' ', 'строки', '.']
assembled = ''.join(segments) # Да, это работает!
И в итоге мы получаем полноценную строку: 'Это пример строки.'
со всеми разделителями.
Полезные материалы
- Подробное руководство по работе с модулем
re
в Python для желающих освоить регулярные выражения: Python re Module – Use Regular Expressions with Python – Regex Support. - Официальная документация Python по модулю
re
: re — Regular expression operations — Python 3.12.2 documentation. - Regex101 — инструмент для создания, тестирования и визуализации регулярных выражений: Regex101: build, test, and debug regex.
- Tutorialspoint предлагает пошаговые примеры работы с модулем
re
в Python: Python – Regular Expressions. - Справочник по методу
split()
для строк на сайте W3Schools: Python String split() Method. - Pythex, онлайн-редактор для быстрого тестирования регулярных выражений: Pythex: a Python regular expression editor.
- Статья от Real Python с примерами использования метода
split()
в Python: Splitting, Concatenating, and Joining Strings in Python – Real Python.