# Token 0 -> Hola # Token 1 -> , # Token 2-> Mundo # Token 3 -> ! # ahora cambia el parseador, aceptando saludos con mas que una sola palabra antes que ',' saludo = Group(OneOrMore(Word(alphas))) + ',' + Word(alphas) + oneOf('! . ?') tokens = saludo.parseString("Hasta mañana, Mundo !") for i, token in enumerate(tokens): print("Token %d -> %s" % (i, token)) # Ahora parseamos algunas cadenas, usando el metodo runTests saludo.runTests("""\ Hola, Mundo! Hasta mañana, Mundo ! """, fullDump=False) # Por supuesto, se pueden "reutilizar" gramáticas, por ejemplo: numimag = Word(nums) + 'i' numreal = Word(nums) numcomplex = numreal + '+' + numimag print(numcomplex.parseString("3+5i")) # Cambiar a complejo numero durante parsear: numcomplex.setParseAction(lambda t: complex(''.join(t).replace('i', 'j'))) print(numcomplex.parseString("3+5i")) # Excelente!!, bueno, los dejo, me voy a seguir tirando código...
# in order to use the int, we need to parse it manually... print(2 * int(res[2])) # option 2 (using named parser parts) nam = Word(alphas) integer = Word(nums) assgnmt_v2 = nam("varname") + "=" + integer("value") res = assgnmt_v2.parseString(assgnmt_str) print(assgnmt_str, "->", res, repr(res)) print(res["varname"], res["value"]) # option 3 from pyparsing import pyparsing_common as cm # there is a predefined f(loating?)number available... assgnmt_v3 = Word(alphas) + "=" + cm.fnumber() assgnmt_str2 = "a = 34.67" res = assgnmt_v3.parseString(assgnmt_str) print(res, 2 * res[2]) res = assgnmt_v3.parseString(assgnmt_str2) print(res, 2 * res[2]) # run several parsing problems as test at once assgnmt_v3.runTests("""\ a = 1.2 b = -4 a = 1.2e4 a = 0.001""")