2009-11-01 19 views
14

Me interesa cómo se puede implementar la coincidencia recíproca de expresiones regulares en Python (no he encontrado ningún ejemplo :(). Por ejemplo, ¿cómo se escribiría una expresión que coincida con "corchete equilibrado" como "foo (bar (bar (foo)))) (foo1) Bar1"¿Cómo se puede implementar una expresión regular recursiva en python?

+4

Escribiría un analizador para esto. – Geo

+1

@Tempus, de hecho, o Tony vendrá. http://stackoverflow.com/a/1732454/193892 –

+1

@AmigableClarkKant está bien, lo sé Tony. Él es un amigo. – Geo

Respuesta

3

Por desgracia no creo que las expresiones regulares de Python admiten los patrones recursivos

probablemente se puede analizar con algo como pyparsing:. http://pyparsing.wikispaces.com/

+1

Hubiera dicho, afortunadamente ... – pillmuncher

4

no puede hacerlo con una expresión regular. Python no es compatible con expresiones regulares recursivas

15

Usted podría utilizar 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) 

Correr cede:

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

Esta es una vieja pregunta, pero para las personas que vienen aquí a través de búsquedas:

Hay un módulo de expresiones regulares alternativa para Python que hace patrones recursivos de soporte: https://pypi.python.org/pypi/regex

Y tiene muchas más mejoras en re.

+1

Awesome new engine! Recursión decente por fin :) Gracias. –

+2

¿Este motor se fusionará con el stdlib de python en algún momento? Parece que no puedo encontrar ninguna conversación reciente sobre esto. –

+1

¡Esta respuesta realmente se beneficiaría de un ejemplo! :) –

Cuestiones relacionadas