需要有关Pyparsing about + = symbol的帮助

时间:2017-07-31 11:54:15

标签: python pyparsing

我们一直在使用pyparsing作为通用配置文件解析器。配置解析器的内部块看起来像这样:

 {
 key1 = [ value1.1, value1.2, value1.3 ];
 key2 = [ value2.1, value2.2, value2.3 ];
 }

使用dictOf和delimitedList,我们最终得到了相应的字典映射键(key1和key2)到相应的值标记列表。

最近,我希望扩展解析器以支持:

 {
 key1 = [ value1.1, value1.2, value1.3 ];
 key1 += [ value1.4, value1.5 ];
 key2 = [ value2.1, value2.2, value2.3 ];
 }

在这个例子中,我希望生成的dict将key1映射到[value1.1,value1.2,value1.3,value1.4,value1.5]。看看可用的pyparsing选项,我没有看到任何明确的方法来做到这一点。谷歌搜索似乎也没有出现任何问题。 (虽然我可能不知道使用哪个搜索词。)

我缺少一些这方面的钩子吗?是否有一些后期处理组合功能我应该做什么?任何人都可以建议接近这个的最好的“pyparsing方式”是什么?

由于

1 个答案:

答案 0 :(得分:0)

Pyparsing在这方面受到了冲击,因为你实际上是在抛出不同的语法。

开箱即用的pyparsing中没有任何内容可以解决这个问题,因此您需要推出自己特殊版本的Dict,它将采用key_expr '=' value_expr ';'行并理解key_expr '+=' value_expr ';'是旨在修改先前定义的密钥。在pyparsing中,您可以使用附加到整个ZeroOrMore表达式的解析操作来执行此操作,该表达式可能包含定义和更新。

import pyparsing as pp

LBRACE,RBRACE,LBRACK,RBRACK,SEMI = map(pp.Suppress, "{}[];")
key_expr = pp.Word(pp.alphas, pp.alphanums)
value_atom = pp.Word(pp.alphas, pp.alphanums + '._')
value_list = LBRACK + pp.delimitedList(value_atom) + RBRACK

key_defn = pp.Group(key_expr("key") + '=' + value_list("value") + SEMI)
key_update = pp.Group(key_expr("key") + '+=' + value_list("value") + SEMI)

# using the trailing '*' will support saving multiple expressions under the same results name
# in this case, it will sort out the "x = []" definitions vs "x += []" updates
key_values = pp.ZeroOrMore(key_defn("defns*") | key_update("updates*"))

# parse action to build a dict beginning with all definitions, and then
# adding updates
def assemble_dict(t):
    ret = {kv.key: kv.value.asList() for kv in t.defns}
    for kv in t.updates:
        ret[kv.key] += kv.value.asList()
    return ret
key_values.addParseAction(assemble_dict)

kv_expr = LBRACE + key_values("vars") + RBRACE

test = """
 {
 key1 = [ value1.1, value1.2, value1.3 ];
 key1 += [ value1.4, value1.5 ];
 key2 = [ value2.1, value2.2, value2.3 ];
 }
"""

print(kv_expr.parseString(test).dump())

打印:

[{'key1': ['value1.1', 'value1.2', 'value1.3', 'value1.4', 'value1.5'], 'key2': ['value2.1', 'value2.2', 'value2.3']}]
- vars: {'key1': ['value1.1', 'value1.2', 'value1.3', 'value1.4', 'value1.5'], 'key2': ['value2.1', 'value2.2', 'value2.3']}

如果您发现以后想要添加对“key4 = key2 + key3”或“key4 + = key2”等内容的支持,您将重新访问用于解析key-value对的表达式,然后再扩展key_values表达式和assemble_dict解析操作。