Этот вопрос задан и ответил много раз раньше. Некоторые примеры: [1], [2]. Но, похоже, нет ничего более общего. То, что я ищу, - это способ разделить строки запятыми, которые не входят в кавычки или пары разделителей. Например:Разделение строк с разделителями-запятыми в python
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, мы можем просто игнорировать запятые и не делать никакого разделения.
Вопрос здесь, есть ли способ быстро с регулярным выражением? Я действительно смотрел на этот solution, но это не похоже, что он охватывает примеры, которые я дал.
Более общая функция будет что-то вроде этого:
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"', ',', [('<', '>'), ('(', ')'), ('"', '"')]
REGEX бы быть в состоянии справиться с этим или необходимо создать специализированный анализатор?
Регулярные выражения не помогут вам в этом случае, так как язык (т. е. группа строк), которую вы пытаетесь разобрать, не является регулярной. Учитывая, что вы допускаете произвольное вложенность тегов, нет простого способа повторного выбора из этого правила. –
Regex не может справиться с этим, и вы не захотите этого. Сложность линейна как минимум, поэтому вы всегда должны получать лучшую производительность с помощью проверки на четность. Вам не нужно строить его самостоятельно. Модуль 'csv' Python выполняет большую часть работы. –
Argh, не говорите, что регулярное выражение не может справиться с этим! Возможно, вкус питона не мог, но другие вкусы, такие как PCRE, могли это сделать! Это [доказательство] (http://regex101.com/r/wU7lC9), мы можем даже получить фантазию и использовать рекурсивные шаблоны для учета вложенных '<>()' – HamZa