2009-11-01 16 views
14

Jestem zainteresowany tym, jak można zaimplementować dopasowanie rekursywnego wyrażenia regularnego w Pythonie (nie znalazłem żadnych przykładów :(). Na przykład w jaki sposób można napisać wyrażenie, które pasuje do "wyrównanego nawiasu", takiego jak "foo (bar (bar")))) (foo1) bar1"W jaki sposób można zaimplementować rekurencyjne wyrażenie regularne w pythonie?

+4

Napisałbym do tego parser. – Geo

+1

@Tempus, w rzeczy samej, albo Tony przyjdzie. http://stackoverflow.com/a/1732454/193892 –

+1

@AmigableClarkKant w porządku, znam Tony'ego. Jest przyjacielem. – Geo

Odpowiedz

3

Niestety nie sądzę Pythona wyrażenia regularne wsparcie rekurencyjnych wzorców

prawdopodobnie można analizować je z czymś pyparsing. http://pyparsing.wikispaces.com/

+1

Powiedziałbym, na szczęście ... – pillmuncher

4

nie można zrobić go z wyrażeń regularnych Python nie obsługuje rekursywnego wyrażenia regularnego

15

You przydałby 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) 

Running to daje:

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

To stara sprawa, ale dla ludzi, którzy przychodzą tutaj przez wyszukiwań:

Istnieje alternatywny moduł regex dla Pythona, dokłada obsługa szablonów rekursywnych: https://pypi.python.org/pypi/regex

Ma wiele innych udoskonaleń na re.

+1

Niesamowite nowy silnik! Przyzwoite rekursje nareszcie :) Dzięki. –

+2

Czy ten silnik zostanie w pewnym momencie połączony ze stdlib Pythona? Nie mogę znaleźć żadnej niedawnej rozmowy na ten temat. –

+1

Ta odpowiedź naprawdę skorzystałaby z przykładu! :) –

Powiązane problemy