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

Python Pyparsing setResultsName属性错误:";“没有这样的属性”;,python,pyparsing,Python,Pyparsing,我很难让setResultsName在这个脚本中为我工作,即使在尝试模拟给出的示例时也是如此。我查阅了文档,查阅了作者的书,并查看了论坛示例。我尝试过几种变体,坦率地说,我有点困惑,尽管我确信我做错了一些愚蠢的事情,因为我在这方面不是很有经验 from pyparsing import * lineId = Word(nums) topicString = Word(alphanums+'-'+' '+"'") expr = Forward() full_entry = Group(lineI

我很难让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
并让它在分号处打断该行,再次附加lineId,然后重新关联它,如您在此行中所看到的:

1768    dummy data
1768    things
27483   other things

还有其他代码来处理格式化输出,我在这里没有显示;我的主要障碍是获取换行符+lineId,我想如果我能让setResultsName工作,我可能会被设置。

像这样将解析过的标记传递到解析操作中,并根据标记而不是解析器表达式访问结果名:

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)

谢谢你,保罗。很抱歉在你的模块上伤了我的牙。当我进行建议的更改时,\n会显示,但lineID不会显示。你只是给了我一个提示,还是我现在应该得到想要的结果?只是一个提示-将这一行添加到新行的开头:
print tokens.dump()
由于
,我认为你有一个额外的嵌套级别,如果是这样,请尝试
tokens[0]。而不是responsenumber
。事实上,你的语法似乎真的太复杂了,比如说,我认为没有理由使用递归正向定义。我这里的示例数据比语法必须解析的要简单得多。我在这里对它进行了简化,以便将重点放在我遇到的问题上。实际上,您帮助我制定了我最近提出的一个问题的语法:当我“print tokens.dump()”时,它只给我一个分号,如果我给它输入它所作用的令牌,这是有意义的。我实际上希望做的是反映您在化学公式示例中对元素权重所做的操作。具体来说,在化学示例中,您定义元素
elementRef=Group(元素(“符号”)+可选(整数,默认值=1)(“数量”)的属性
-以便稍后您可以在计算元素和分子量时引用这些解析结果元素:
mw=sum([atomicWeight[element.symbol]*formulaData中元素的元素数量])
同样,我也在尝试获取该id号,以便在换行后可以再次插入。我认为,事实上,我不赞成在问答上添加长评论链,所以wiki可能更好。发布到wiki主页上的“讨论”选项卡。仅供参考,asList()将ParseResults转换为简单的标记嵌套列表,因此您可以将其传递给严格期望列表的例程,如pprint,但这会去除所有命名结果。人们喜欢asList(),因为输出看起来更干净;打印出来的ParseResults显示嵌套列表和结果名称的dict。但是您可以像列表一样访问ParseResults,所以我很惊讶删除asList()会破坏其他代码。谢谢,Phil。我很感激!
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)