Этот вопрос уже задавался и на него уже много раз давался ответ. Некоторые примеры: [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"', ',', [('<', '>'), ('(', ')'), ('"', '"')]
Сможет ли регулярное выражение справиться с этим или необходимо создать специализированный парсер?
csvвыполняет большую часть работы. - person Slater Victoroff   schedule 16.12.2013<>()- person HamZa   schedule 16.12.2013