Pyparsing无法将文件解析到dictionary structu

2024-04-20 16:15:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Pyparsing来解析aspatix(.apx)格式的文件(http://www.dbai.tuwien.ac.at/research/project/argumentation/systempage/docu.htm),我在将结果结构化到字典时遇到问题。在

我指定语法如下:

from pyparsing import *

ID = Word(alphanums)
arg_pair = Group(ID + Suppress(',') + ID)
value = Word(nums)
lineEnd = Suppress(').')
arg = Suppress('arg(') + ID + lineEnd
attack = Suppress('att(') + arg_pair + lineEnd
pref = Suppress('pref(') + arg_pair + lineEnd
val = Suppress('val(') + ID + Suppress(',') + value + lineEnd
valpref = Suppress('valpref(') + value + Suppress(',') + value +  lineEnd
support = Suppress('support(') + arg_pair + lineEnd

apx = OneOrMore(arg.setName('arg') | attack.setName('att') | pref.setName('pref') | val.setName('val') | valpref.setName('valpref') | support.setName('support'))

我不确定如何使用setName()函数定义字典键,以便arg、attack等规则的每次出现都映射到定义的键。使用上面的代码不会产生可用的字典键。在

例如:

^{2}$

将映射到:

{"arg": ["a","b"], "att":[["a","b"]]}

如果你能给我任何帮助,我将不胜感激。在


Tags: idsupport字典valueargvalattpref
1条回答
网友
1楼 · 发布于 2024-04-20 16:15:37

关于解析器的一些其他评论:

  • 通常,您应该避免定义将关键字与相关标点符号相结合的文字。例如,将arg定义为Suppress('arg(')将专门查找“arg(”,如果关键字和左括号之间有空格,则失败。相反,我建议使用Keyword类定义关键字。如果您愿意,可以禁止这些,但是关键字将强制执行单词的完全匹配,并防止意外匹配“valpref”的前导“val”。

  • 将ID定义为Word(alphanums)将为ID和整数值之间的混淆打开大门。我希望标识符至少总是以字母字符开头,因此您可以使用Word的双参数形式将字母指定为允许的前导字符集,并将字母数字指定为允许的正文字符集。

  • 请参阅我对您帖子的评论:setName()vssetResultsName()

我稍微修改了一下解析器,使所有命令都有相同的键:“cmd”和“args”。这允许您编写多态代码,如本示例末尾的for循环。在

from pyparsing import *
LPAR,RPAR,DOT,COMMA = map(Suppress,"().,")
arg,attack,pref,val,valpref,support = map(Keyword, 
    "arg att pref val valpref support".split())

ID = Word(alphas, alphanums)
id_pair = Group(ID + COMMA + ID)
integer = Word(nums)
int_pair = Group(integer + COMMA + integer)

arg_cmd = Group(arg("cmd") + LPAR + ID("args") + RPAR)
attack_cmd = Group(attack("cmd") + LPAR + id_pair("args") + RPAR)
pref_cmd = Group(pref("cmd") + LPAR + id_pair("args") + RPAR)
val_cmd = Group(val("cmd") + LPAR + Group(ID + COMMA + integer)("args") + RPAR)
valpref_cmd = Group(valpref("cmd") + LPAR + int_pair("args") + RPAR)
support_cmd = Group(support("cmd") + LPAR + id_pair("args") + RPAR)

apx = OneOrMore((arg_cmd | attack_cmd | pref_cmd | val_cmd | valpref_cmd | support_cmd) + DOT)

for command in apx.parseString(apxSource):
    print command.dump()
    print command.cmd
    print command.args

如果你想遵循你最初的命名计划,我想应该是这样的。在

^{pr2}$

或者这个。在

arg_cmd = (arg + LPAR + ID("arg*") + RPAR)
attack_cmd = (attack + LPAR + id_pair("attack*") + RPAR)
pref_cmd = (pref + LPAR + id_pair("pref*") + RPAR)
val_cmd = (val + LPAR + Group(ID + COMMA + integer)("val*") + RPAR)
valpref_cmd = (valpref + LPAR + int_pair("valpref*") + RPAR)
support_cmd = (support + LPAR + id_pair("support*") + RPAR)

正如您所看到的,有许多方法可以构造这些解析器和生成的解析结构,围绕个人风格以及正确与错误进行旋转。在最后两个示例中,没有定义“cmd”或“args”名称,因此必须从上面的for循环代码示例中删除它们。如果您正在寻找dict-key-like解析,我认为最后一个结构将最像您正在寻找的。但是,请注意,这个解析器将放弃命令的查找顺序。如果顺序很重要,您可能应该使用前两个示例中的一个,因为Group类将保持命令顺序不变。在

相关问题 更多 >