Как можно реализовать рекурсивное регулярное выражение в python?

Мне интересно, как можно реализовать рекурсивное совпадение регулярных выражений в Python (я не нашел примеров:(). Например, как бы написать выражение, которое соответствует "сбалансированной балансировке" строки, например "foo (bar (bar (bar) Foo))) (foo1) BAR1"

Ответы

Ответ 1

Вы можете использовать pyparsing

#!/usr/bin/env python
from pyparsing import nestedExpr
import sys
astring=sys.argv[1]
if not astring.startswith('('):
    astring='('+astring+')'

expr = nestedExpr('(', ')')
result=expr.parseString(astring).asList()[0]
print(result)

Запуск:

% test.py "foo(bar(bar(foo)))(foo1)bar1"
['foo', ['bar', ['bar', ['foo']]], ['foo1'], 'bar1']

Ответ 2

Это старый вопрос, но для людей, которые приходят сюда через поисковые запросы:

Существует альтернативный модуль регулярных выражений для python, который поддерживает рекурсивные шаблоны: https://pypi.python.org/pypi/regex

И он имеет много приятных улучшений на re.

Ответ 3

Вы не можете сделать это с помощью регулярного выражения. Python не поддерживает рекурсивное регулярное выражение

Ответ 4

К сожалению, я не думаю, что регулярные выражения Python поддерживают рекурсивные шаблоны.

Возможно, вы можете разобрать его с помощью чего-то вроде pyparsing: http://pyparsing.wikispaces.com/