Sono nuovo a Pyparsing (e piuttosto nuovo a Python). Ho cercato di ridurre il mio problema alla forma più semplice che illustrerà cosa non va (al punto in cui probabilmente non avrei affatto bisogno di Pyparsing!)Pyparsing newbie setParseAction che modifica i token
Supponiamo di avere una stringa composta da lettere e numeri , ad esempio "b7 z4 a2 de c3". C'è sempre una lettera, ma il numero è facoltativo. Voglio analizzare questo nei suoi singoli elementi e quindi elaborarli, ma dove c'è una lettera vuota, senza numero, sarebbe utile cambiarla in modo che avesse il numero "predefinito" 1 dopo di esso. Quindi potrei elaborare ogni elemento in modo coerente. Ho pensato che avrei potuto fare questo con un setparseAction, come segue:
from pyparsing import *
teststring = "a2 b5 c9 d e z"
expected_letter = Word("ABCDEFGabcdefgzZxy", exact=1)
expected_number = Word(nums)
letter_and_number = expected_letter + expected_number
bare_letter = expected_letter
bare_letter.setParseAction(lambda s,l,t: t.append("1"))
elements = letter_and_number | bare_letter
line = OneOrMore(elements)
print line.parseString(teststring)
Purtroppo, il t.append() non fa quello che mi aspetto, che era quello di aggiungere un "1" per l'elenco dei gettoni analizzati. Invece, ottengo un errore: TypeError: l'oggetto 'str' non è richiamabile.
Probabilmente sono solo molto fico, qui, ma uno di voi esperti potrebbe dirmi chiaramente.
Grazie
Steve
Ah sì, questo ha perfettamente senso ora! Quando ho stampato i risultati delle analisi, sembravano una lista normale, quindi ho pensato di poter aggiungere il solito modo. Inoltre, mi sono perso il fatto che Opzionale consente un'impostazione predefinita, che fornisce una soluzione complessiva più ordinata.E si applicherà al mio programma attuale, che è un po 'più complesso della versione ridotta qui. molte grazie per il tuo aiuto .... e per Pyparsing stesso! Steve. –