¿Dificultad de este trabajo en particular usando pyparsing? (principiante)

Tengo la tarea de hacer eso. Estoy seguro de que Python y pyparsing realmente podrían ayudar, pero todavía soy demasiado novato con la progtwigción para tomar una decisión inteligente sobre qué tan difícil será la implementación completa y si vale la pena intentarlo. Es cierto que será un infructuoso fregadero del tiempo.

La tarea es traducir cadenas de longitud arbitraria y profundidad de anidamiento con una estructura que siga la gramática general de esta:

item12345 'topic(subtopic(sub-subtopic), subtopic2), topic2' 

en un artículo en un diccionario como este:

 {item12345, 'topic, topic:subtopic, topic:subtopic:sub-subtopic, topic:subtopic2, topic2'} 

En otras palabras, la lógica es exactamente como las matemáticas donde el elemento inmediatamente a la izquierda del paréntesis se distribuye a todo lo que está dentro, y el ‘,’ designa los términos dentro de los paréntesis, de manera muy similar a cómo funciona la adición con respecto a los factores de un binomio .

He descubierto por mí mismo o encontrado y comprendido ejemplos de algunos de los elementos aparentemente necesarios para crear esta solución hasta el momento.

Analizar expresiones anidadas en Python:

 def parenthetic_contents(string): """Generate parenthesized contents in string as pairs (level, contents).""" stack = [] for i, c in enumerate(string): if c == '(': stack.append(i) elif c == ')' and stack: start = stack.pop() yield (len(stack), string[start + 1: i]) 

Distribuyendo una cadena a otros:

 from pyparsing import Suppress,Word,ZeroOrMore,alphas,nums,delimitedList data = '''\ MSE 2110, 3030, 4102 CSE 1000, 2000, 3000 DDE 1400, 4030, 5000 ''' def memorize(t): memorize.dept = t[0] def token(t): return "Course: %s %s" % (memorize.dept, int(t[0])) course = Suppress(Word(alphas).setParseAction(memorize)) number = Word(nums).setParseAction(token) line = course + delimitedList(number) lines = ZeroOrMore(line) final = lines.parseString(data) for i in final: print i 

Y algunos otros, pero estos métodos no se aplicarán directamente a mi solución definitiva, y todavía tengo mucho camino por recorrer antes de que entienda a python y pyparsing lo suficientemente bien como para combinar las ideas o encontrar otras nuevas.

Lo he estado tratando de encontrar, buscando ejemplos que funcionen de la misma manera, aprendiendo más Python y más clases y métodos de creación de pips, pero no estoy seguro de cuán lejos estoy de saber lo suficiente para hacer algo que funcione. para mi solución completa en lugar de solo ejercicios intermedios que no funcionarán para el caso general.

Así que mis preguntas son estas. ¿Qué tan compleja será la solución que necesitaré para hacer lo que estoy buscando? ¿Qué sugerencias tienes que podrían ayudarme a acercarme?

¡Gracias por adelantado! (PS – primer post en StackOverflow, avísame si necesito hacer algo diferente con respecto a este post)

En pyparsing, su ejemplo se vería algo así como:

 from pyparsing import Word,alphanums,Forward,Optional,nestedExpr,delimitedList topicString = Word(alphanums+'-') expr = Forward() expr << topicString + Optional(nestedExpr(content=delimitedList(expr))) test = 'topic(subtopic(sub-subtopic), subtopic2), topic2' print delimitedList(expr).parseString(test).asList() 

Huellas dactilares

 ['topic', ['subtopic', ['sub-subtopic'], 'subtopic2'], 'topic2'] 

La conversión al topic:subtopic , etc. se deja como un ejercicio para el OP.