Ошибка атрибута pyparsing setResultsName: "нет такого атрибута"

У меня возникают проблемы с тем, чтобы setResultsName работало для меня в этом сценарии, даже при попытке эмулировать приведенные примеры. Я просмотрел документацию, ознакомился с книгой автора и просмотрел примеры на форуме. Я пробовал несколько вариантов, и я, честно говоря, немного озадачен, хотя я уверен, что есть что-то глупое, что я делаю неправильно, потому что я не очень опытен в этом.

from pyparsing import *

lineId = Word(nums)
topicString = Word(alphanums+'-'+' '+"'")
expr = Forward()
full_entry = Group(lineId('responsenumber') + expr)

def new_line():
    return '\n' + lineId.responsenumber # <-- here is the line that causes the error

expr << topicString + Optional(nestedExpr(content=delimitedList(expr))) + Optional((Literal(';').setParseAction(new_line) + expr))


for line in input:
    inputParseResults = delimitedList(full_entry).parseString(line).asList()
    print inputParseResults

Эта часть кода пытается сделать следующее:

1768    dummy data; things
27483   other things

И пусть он разбивает строку в точке с запятой, снова присоединяет lineId, а затем повторно связывает его, как вы видите в этой строке:

1768    dummy data
1768    things
27483   other things

Есть другой код для обработки форматирования, который я здесь не показывал; Моим главным препятствием является получение разрыва строки + lineId, и я думаю, что если бы я мог заставить setResultsName работать, я мог бы быть установлен.

2 ответа

Решение

Передайте проанализированные токены в свое действие синтаксического анализа, как показано ниже, и получите доступ к именам результатов по токенам, а не по выражениям синтаксического анализатора:

def new_line(tokens): 
    return '\n' + tokens.responsenumber

С помощью setParseAction а также forward Обе эти вещи могут сделать мою голову больной (вот откуда я знаю, что код будет нечитаемым при следующем просмотре).

Для того, что вы описали, delimitedList был хорошим выбором. Если вам действительно не нужно действие разбора для другой магии, как насчет просто:

from pyparsing import *

topicParser = Word(nums)("line") + \
              delimitedList(Word(alphanums+'-'+' '+"'"),';')("list")

for line in input:
    topics = topicParser.parseString(line)
    lineid = topics['line']
    for topic in topics['list']:
        print "{0} {1}".format(lineid,topic)
Другие вопросы по тегам