Jestem nowy w Pyparsing (i całkiem nowy w Pythonie). Próbowałem ograniczyć mój problem do najprostszej formy, która zilustruje, co dzieje się nie tak (do punktu, w którym prawdopodobnie nie będę potrzebował Pyparowania!)Pyparsing newbie setParseAction modyfikujące tokeny
Załóżmy, że mam ciąg złożony z liter i cyfr , na przykład "b7 z4 a2 de c3". Zawsze jest litera, ale liczba jest opcjonalna. Chcę przetworzyć to na poszczególne elementy, a następnie je przetwarzać, ale tam, gdzie jest pusta litera, bez numeru, byłoby wygodniej zmienić ją tak, aby miała po niej "domyślną" cyfrę 1. Wtedy mógłbym przetwarzać każdy element w spójny sposób. Myślałem, że mogę robić to z setparseAction, co następuje:
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)
Niestety t.append() nie robi tego, co ja oczekuję, która miała dodać „1” na liście analizowane żetony. Zamiast tego pojawia się błąd: TypeError: obiekt "str" nie jest wywoływalny.
Prawdopodobnie po prostu jestem naprawdę gęsty, ale może jeden z was, eksperci, wyprostuje mnie.
Dzięki
Steve
Ach tak, teraz ma to sens! Kiedy wydrukowałem wyniki analizy, wyglądały jak normalna lista, więc pomyślałem, że mogę dołączyć w zwykły sposób. Brakowało mi również faktu, że Opcjonalnie pozwala na ustawienie domyślne, które zapewnia lepsze ogólne rozwiązanie.I będzie to dotyczyło mojego aktualnego programu, który jest nieco bardziej skomplikowany niż wersja tutaj obnażona. bardzo dziękuję za pomoc .... i za samą Pyparsing! Steve. –