Pyparsing setResultsName属性错误:“没有这样的属性”

时间:2012-04-27 21:38:25

标签: python pyparsing

我无法让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 个答案:

答案 0 :(得分:1)

将解析后的标记传递给您的解析操作,并根据标记访问结果名称,而不是针对解析器表达式:

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

答案 1 :(得分:1)

使用setParseActionforward这些都会让我的头受伤(这就是我知道下次看到它时代码无法读取的原因)。

对于你所描述的,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)