У меня есть вложенный блок текста, который не обязательно хорошо отформатирован (с отступом), который необходимо проанализировать и обработать дальше.
Пример текста:
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);']]]]]]