Как рекурсивное регулярное выражение может быть реализовано в python? - PullRequest
14 голосов
/ 01 ноября 2009

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

Ответы [ 4 ]

15 голосов
/ 01 ноября 2009

Вы можете использовать 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']
11 голосов
/ 01 июля 2013

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

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

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

4 голосов
/ 01 ноября 2009

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

3 голосов
/ 01 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...