Ошибка атрибута 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)