2012-09-13 8 views
5

Czy można powiedzieć, aby pyparsing nie zapisywał ParseResults lub ręcznie je odrzucał?Jak odrzucić pyparsing parseResults podczas parsowania?

Parsuję duży plik pozycji i mogę wykonać wszystkie przetwarzanie końcowe dla każdego elementu za pomocą akcji parsowania. Tak więc, jak tylko element zostanie przeanalizowany, nie potrzebuję już tego ParseResult i chciałbym móc go odrzucić, ponieważ osiągam limit pamięci urządzenia, na którym się znajduję.

Odpowiedz

4

Czy używasz analizowanych składni do przetwarzania tokenów podczas ich analizy? Jeśli tak, to można usunąć zawartość analizowanych tokenów z wykorzystaniem del:

def parseActionThatDeletesTheParsedTokens(tokens): 
    # ... 
    # do something interesting with the tokens 
    # ... 

    # delete the contents of the parsed tokens 
    del tokens[:] 

A może chcesz po prostu użyć scanString zamiast parseString. Zamiast tego:

OneOrMore(blockOfText).parseString(bigHonkingString) 

zrobić:

for tokens, matchstart, matchend in blockOfText.scanString(bigHonkingString): 
    # do stuff with the tokens 

scanString zwraca generator co przynosi 3-krotki zawierające dopasowane tokeny, wyjściowy, a skończywszy lokalizację każdym kolejnym meczu. Możesz przetworzyć każdy przeanalizowany zestaw tokenów, a kiedy przejdziesz do następnego zestawu, stary zestaw zostanie automatycznie odrzucony. Myślę, że to może być najprostszy sposób, aby przejść, przy minimalnych zmianach w programie.

+0

Tak, właśnie to robię. Użycie 'del' do zrobienia tego powinno naprawdę mi się przydać, ale masz rację, scanString jest o wiele lepszy. Dobrze wiedzieć, że pyparsing ma tę funkcję. Dzięki! – nedned

+0

Paul, czy '.suppress()' fraza nadal zachowuje zawartość w pamięci po uruchomieniu 'parseAction'? – Hooked

+0

Nie - jeśli wyrażenie jest wyłączone, jego zawartość nie jest zapisywana przez pyparsing. – PaulMcG

Powiązane problemy