Разделение строк через запятую в 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"', ',', [('<', '>'), ('(', ')'), ('"', '"')]

Сможет ли регулярное выражение справиться с этим или необходимо создать специализированный парсер?

Ответы на вопрос(3)

Ваш ответ на вопрос