我试图编写一个解析器来处理来自注册器的API的响应数据。这种格式不是我以前见过的格式,所以这可能非常简单;如果有人认识到它,请告诉我,并且可能有一个预先存在的库来处理它。但现在我的假设是我需要自己来解析它。在
我的语法是这样的:
equals = Literal("=").suppress()
lbracket = Literal("[").suppress()
rbracket = Literal("]").suppress()
lbrace = Literal("{").suppress()
rbrace = Literal("}").suppress()
value_dict = Forward()
value_list = Forward()
value_string = Word(alphanums + "@. ")
value = value_list ^ value_dict ^ value_string
values = Group(delimitedList(value, ","))
value_list << lbracket + values + rbracket
identifier = Word(alphanums + "_.")
assignment = Group(identifier + equals + Optional(value))
assignments = Dict(delimitedList(assignment, ';'))
value_dict << lbrace + assignments + rbrace
response = assignments
当我运行这个简单的测试用例时:
^{pr2}$我得到以下信息:
{'username': 'goat', 'empty_field': '', 'errors': {'username': {}}}
errors['username']应该是一个字符串列表,但显示为空dict。当I.dump()参数时,看起来一切正常:
ss = response.searchString(rsp)
for i in ss:
print i.dump()
产量:
- empty_field:
- errors: [['username', ['already taken', 'too short']]]
- username: ['already taken', 'too short']
- username: goat
我做错什么了?在
它是当前版本pyparsing中}的工作原理类似。但是,
asDict()
的一个幼稚实现。在yoru语法中,可以创建两种不同样式的ParseResults:带有名称的结果和仅为普通列表的结果。asList()
只需迭代一个嵌套的ParseResults获取列表和子列表,因此{asDict()
确实需要对可能存在的值的类型稍微聪明一点——目前,这是pyparsing中的一个bug。在编辑
要解决这个问题,您需要做一些工作,将列表存储为实际列表,而不是作为ParseResults。将
values
表达式重新定义为:因为这将返回解析后的列表,而不是ParseResults,而是实际的列表,
toDict()
不会尝试将其转换为dict相关问题 更多 >
编程相关推荐