Разделение строк через запятую в Python
Этот вопрос задавался и отвечал много раз прежде. Некоторые примеры:[1], [2], Но, кажется, нет ничего более общего. Я ищу способ разбить строки на запятые, которые не находятся в кавычках или парах разделителей. Например:
s1 = 'obj<1, 2, 3>, x(4, 5), "msg, with comma"'
следует разбить на список из трех элементов
['obj<1, 2, 3>', 'x(4, 5)', '"msg, with comma"']
Проблема в том, что это может стать более сложным, так как мы можем посмотреть на пары<>
а также()
.
s2 = 'obj<1, sub<6, 7>, 3>, x(4, y(8, 9), 5), "msg, with comma"'
который должен быть разбит на:
['obj<1, sub<6, 7>, 3>', 'x(4, y(8, 9), 5)', '"msg, with comma"']
Наивное решение без использования регулярных выражений состоит в том, чтобы проанализировать строку, ища символы,<(
, Если либо<
или же(
найдены, тогда мы начинаем считать паритет. Мы можем разделить запятую, только если четность равна нулю. Например, сказать, что мы хотим разделитьs2
мы можем начать сparity = 0
и когда мы достигнемs2[3]
мы сталкиваемся<
который увеличит четность на 1. Четность будет уменьшаться только тогда, когда он сталкивается>
или же)
и он увеличится, когда он сталкивается<
или же(
, Хотя четность не равна 0, мы можем просто игнорировать запятые и не разбивать.
Вопрос в том, есть ли способ быстро с помощью регулярных выражений? Я действительно смотрел на эторешение но это не похоже на примеры, которые я привел.
Более общая функция будет выглядеть примерно так:
def split_at(text, delimiter, exceptions):
"""Split text at the specified delimiter if the delimiter is not
within the exceptions"""
Некоторые применения будут выглядеть так:
split_at('obj<1, 2, 3>, x(4, 5), "msg, with comma"', ',', [('<', '>'), ('(', ')'), ('"', '"')]
Сможет ли регулярное выражение справиться с этим или необходимо создать специализированный парсер?