我如何在pyparsing中使用不同的解析器来处理nestedExpr标识的内容

时间:2019-01-28 19:08:48

标签: python-2.7 pyparsing

我有一个嵌套的文本块,它不一定格式正确(缩进),需要进一步解析和操作。

文本示例:

cell(hi) {
    param1 : true;
    param2 : false;
    func1() {
     param3 : hello;
        param4 : hi;
    }
    func2() {
    param5 : 10;
    nestedFunc1() {
        nestedParam6 : 20;
       nestedFunc2(args) {
        index1(a,b,c,d,e);
        values(1,2,3,4,\
               5);
       }
    }
    }
}

上面的代码段是我要解析的文本的示例。

到目前为止,这是我想出的解析器:

Group(Word("cell") + QuotedString('(', escChar=None, endQuoteChar=')') + nestedExpr(opener='{', closer='}').setResultsName("cell")

我尝试将content=LineEnd()参数用于nestedExpr调用,但这并不能满足我的期望。

除此之外,我还为cell {...}包装器中的内容提供了一些其他解析器。例子:

params          = Group(Regex(r'(.*)\s*:\s*(.*);')).setResultsName("params")
LookupTables    = Group(Word(k) + QuotedString('(', escChar=None, endQuoteChar=')') + QuotedString("{", multiline=True, endQuoteChar="}") )

我想知道是否有一种有效的方法来解析嵌套块并以以下格式获取输出:

[
    ['cell', 'hi']
    {'param1': 'true'}
    {'param2': 'false'}
    ['func1'
        {'param3': 'hello'}
        {'param4': 'hi'}
    ]
    ['func2'
        {'param5': '10'}
        ['nestedFunc1'
            {'index1(a,b,c,d,e)': None}
            {'values(1,2,3,4,5)': None}
        ]
    ]
]

基本上,我正在尝试获取数据内部的查找表:

index1(a) = 1
index1(b) = 2
index1(c) = 3
index1(d) = 4
index1(e) = 5

当我尝试在输入文本上使用nestedExpr时,会获得一个嵌套的列表,其中所有内容均用空格分隔,没有换行符(如下所示)。我至少需要换行符,以便我可以加入输出并重新创建原始的嵌套数据块,以使用setParseAction等应用我自己的解析器。

这是我当前获得的输出:

Parser:
tp      = Group(Word("cell") + QuotedString('(', escChar=None, endQuoteChar=')') + nestedExpr(opener='{', closer='}') ).setResultsName("cell")

Output:
[['cell', 'hi', ['param1', ':', 'true;', 'param2', ':', 'false;', 'func1()', ['param3', ':', 'hello;', 'param4', ':', 'hi;'], 'func2()', ['param5', ':', '10;', 'nestedFunc1()', ['nestedParam6', ':', '20;', 'nestedFunc2(args)', ['index1(a,b,c,d,e);', 'values(1,2,3,4,\\', '5);']]]]]]

0 个答案:

没有答案