Рекурсивный шаблон в регулярном выражении

Это очень связано сРегулярное выражение для соответствия внешним скобкам Тем не менее, я специально хочу знать, как или возможно ли это сделатьРекурсивный шаблон регулярного выражения? Мне еще предстоит найти пример на python, использующий эту стратегию, поэтому думаю, что это должен быть полезный вопрос!

Явидели немного требования тот Рекурсивные шаблоны могут использоваться для соответствия сбалансированным круглым скобкам, но нет примеров использования Pythonрегулярное выражение пакет (Примечание: рене поддержка рекурсивного шаблона, вам нужно использовать регулярные выражения).

ОдинЗапрос это синтаксисb(?:m|(?R))*e где:

b это то, что начинает конструкцию,m это то, что может произойти в середине конструкции, иe это то, что может произойти в конце конструкции

Я хочу извлечь спички длявнешний брекеты в следующем:

"{1, {2, 3}} {4, 5}"
["1, {2, 3}", "4, 5"]  # desired

Обратите внимание, что это легко сделать то же самое длявнутренний брекеты:

re.findall(r"{([^{}]*)}", "{1, {2, 3}} {4, 5}")
['2, 3', '4, 5']

(В моем примере я использовал finditer (более подходящих объектов), см.Вот.)

Поэтому я надеялся, что следующее или какое-то изменение подойдет:

regex.findall(r"{(:[^{}]*|?R)}", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:[^{}]*|?R)})", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:.*|(?R))*})", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:.*)|(?R)*})", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:[^{}])|(?R)})", "{1, {2, 3}} {4, 5}")

но меня смутило либо [], либоerror: too much backtracking.

Можно ли извлечь объекты соответствия для внешней скобки с помощью рекурсии regex?

Очевидно, я рискую быть застреленным с:

не анализировать HTML с регулярным выражениемсделать это с pyparseнаписать правильный лексер и парсер, например используя слой

Я хочу подчеркнуть, что это окак использовать рекурсивный шаблон (что, если мое понимание правильное, выводит нас за пределы обычного синтаксического анализа, поэтому на самом деле это может быть возможным!). Если это можно сделать, это должно быть более чистым решением.

Ответы на вопрос(2)

Ваш ответ на вопрос