Если вы хотите использовать синтаксический анализатор (в данном случае lepl), но по-прежнему хотите получить промежуточные результаты, а не окончательный проанализированный список, то я думаю, что вы искали именно такую вещь:
>>> nested = Delayed()
>>> nested += "{" + (nested[1:,...]|Any()) + "}"
>>> split = (Drop("{") & (nested[:,...]|Any()) & Drop("}"))[:].parse
>>> split("{{a}{b}{{{c}}}}")
['{a}{b}{{{c}}}']
>>> split("{a}{b}{{{c}}}")
['a', 'b', '{{c}}']
>>> split("{{c}}")
['{c}']
>>> split("{c}")
['c']
Поначалу это может выглядеть непрозрачно, но на самом деле все довольно просто: o)
nested - рекурсивное определение сопоставителя для вложенных скобок («+» и [...] в определении сохраняют все как одну строку после сопоставления). Тогда split говорит, что соответствует как можно большему количеству ("[:]") чего-то, что окружено "{" ... "}" (который мы отбрасываем с помощью "Drop") и содержит либо вложенное выражение или любая буква.
Наконец, вот lepl-версия синтаксического анализатора «все в одном», который дает результат в том же формате, что и в приведенном выше примере с анализом, но который (я считаю) более гибок в отношении того, как пробелы появляются во входных данных:
>>> with Separator(~Space()[:]):
... nested = Delayed()
... nested += Drop("{") & (nested[1:] | Any()) & Drop("}") > list
...
>>> nested.parse("{{ a }{ b}{{{c}}}}")
[[['a'], ['b'], [[['c']]]]]