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ćs2
moż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?