Podział ciągów rozdzielanych przecinkami w Pythonie

To pytanie zostało zadane i wielokrotnie udzielane. Kilka przykładów:[1], [2]. Ale wydaje się, że nie ma czegoś bardziej ogólnego. To, czego szukam, to sposób na rozdzielanie ciągów w przecinkach, które nie znajdują się w cudzysłowach lub parach ograniczników. Na przykład:

s1 = 'obj<1, 2, 3>, x(4, 5), "msg, with comma"'

należy podzielić na listę trzech elementów

['obj<1, 2, 3>', 'x(4, 5)', '"msg, with comma"']

Problem polega na tym, że może to być bardziej skomplikowane, ponieważ możemy zajrzeć do par<> i().

s2 = 'obj<1, sub<6, 7>, 3>, x(4, y(8, 9), 5), "msg, with comma"'

które należy podzielić na:

['obj<1, sub<6, 7>, 3>', 'x(4, y(8, 9), 5)', '"msg, with comma"']

Naiwnym rozwiązaniem bez użycia wyrażenia regularnego jest parsowanie ciągu znaków w poszukiwaniu znaków,<(. Jeśli tak, to< lub( zostaną znalezione, wtedy zaczniemy liczyć parzystość. Możemy podzielić tylko przecinek, jeśli parzystość wynosi zero. Na przykład powiedzmy, że chcemy się podzielićs2możemy zacząć odparity = 0 i kiedy docieramys2[3] spotykamy< co zwiększy parzystość o 1. Parzystość zmniejszy się tylko wtedy, gdy napotka> lub) i wzrośnie, gdy napotka< lub(. Podczas gdy parzystość nie jest równa 0, możemy po prostu zignorować przecinki i nie wykonywać żadnych podziałów.

Pytanie tutaj brzmi: czy można szybko to osiągnąć za pomocą wyrażenia regularnego? Naprawdę się tym zajmowałemrozwiązanie ale to nie wydaje się obejmować przykładów, które podałem.

Bardziej ogólną funkcją byłoby coś takiego:

def split_at(text, delimiter, exceptions):
    """Split text at the specified delimiter if the delimiter is not
    within the exceptions"""

Niektóre zastosowania byłyby następujące:

split_at('obj<1, 2, 3>, x(4, 5), "msg, with comma"', ',', [('<', '>'), ('(', ')'), ('"', '"')]

Czy regex będzie w stanie poradzić sobie z tym, czy konieczne jest utworzenie specjalistycznego parsera?

questionAnswers(3)

yourAnswerToTheQuestion