Это очень похоже на Регулярное выражение для соответствия внешним скобкам, однако я специально хочу знать, как это сделать или можно ли это сделать рекурсивный шаблон regex? Я еще не нашел пример python, используя эту стратегию, поэтому подумайте, что это должен быть полезный вопрос!
Я видел несколько претензий что рекурсивные шаблоны могут использоваться для сопоставления сбалансированной круглой скобки, но нет примеров с использованием python regex (Примечание: re не поддерживает рекурсивный шаблон, вам нужно использовать регулярное выражение).
Один утверждение заключается в том, что синтаксис 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
.
Можно ли извлекать объекты соответствия для внешней скобки с помощью рекурсии регулярных выражений?
Очевидно, я рискую быть сбитым с помощью:
- не анализировать html с регулярным выражением
- сделать это с помощью pyparse
- напишите правильный лексер и парсер, например. используя слой
Я хочу подчеркнуть, что речь идет о как использовать рекурсивный шаблон (который, если мое понимание верное, выводит нас за рамки регулярного разбора языка, так что это может быть действительно возможно!). Если это можно сделать, это должно быть более чистым решением.