he aquí una solución pyparsing que utiliza una gramática propia modificar dinámicamente para que coincida con el carácter de llave de cierre correcta.
from pyparsing import *
data = '(gimme [some {nested, nested [lists]}])'
opening = oneOf("({ [")
nonBracePrintables = ''.join(c for c in printables if c not in '(){}[]')
closingFor = dict(zip("({[",")}]"))
closing = Forward()
# initialize closing with an expression
closing << NoMatch()
closingStack = []
def pushClosing(t):
closingStack.append(closing.expr)
closing << Literal(closingFor[t[0]])
def popClosing():
closing << closingStack.pop()
opening.setParseAction(pushClosing)
closing.setParseAction(popClosing)
matchedNesting = nestedExpr(opening, closing, Word(alphas) | Word(nonBracePrintables))
print matchedNesting.parseString(data).asList()
impresiones:
[['gimme', ['some', ['nested', ',', 'nested', ['lists']]]]]
Actualizado: que fijan la solución anterior porque en realidad se había escrito hace más de un año como un experimento. Me tomó un vistazo más de cerca a su puesto original, y me hizo pensar en la definición de tipo recursivo creado por el método operatorPrecedence
, y así hice de nuevo esta solución, la utilización de su enfoque original - mucho más simple de seguir! (Podría tener un problema de izquierda recursividad con los datos de entrada de la derecha, sin embargo, no prueba a fondo):
from pyparsing import *
enclosed = Forward()
nestedParens = nestedExpr('(', ')', content=enclosed)
nestedBrackets = nestedExpr('[', ']', content=enclosed)
nestedCurlies = nestedExpr('{', '}', content=enclosed)
enclosed << (Word(alphas) | ',' | nestedParens | nestedBrackets | nestedCurlies)
data = '(gimme [some {nested, nested [lists]}])'
print enclosed.parseString(data).asList()
Da:
[['gimme', ['some', ['nested', ',', 'nested', ['lists']]]]]
Pablo, muchas gracias por la respuesta informativa. ¡Y muchas gracias por crear y abrir mi nueva biblioteca favorita de Python! Pyparsing me está ayudando a reducir drásticamente el tamaño, la complejidad y la capacidad de mantenimiento de un proyecto en el que he estado trabajando. – Derek
Gracias por los cumplidos, bienvenidos a pyparsing! – PaulMcG