python: парсинг запросов с заданным словарем
есть текстовая строка типа
text = "my-data='ab\"c x\'yz' AND (param1=123 OR param2='test')"
хотелось бы ее корректно распарсить
минимум получить значение по полю (т.е. на выходе после парсинга есть какой-нибудь словарь с ключами и значениями
получить и логику (т.е. после парсинга будет некоторое дерево где AND OR и скобки - это узлы)
подскажите, есть ли какие-нибудь хорошие библиотеки для решения данных задач, потому что писать свой код не очень удобно (сложная логика, многих вещей сразу не учесть и т.д.)
Ответы (1 шт):
Автор решения: Roman-Stop RU aggression in UA
→ Ссылка
Один из хороших вариантов, это создать свой парсер используя библиотеки для построения парсеров.
Вот пример с использованием lark для (почти) вашего случая:
from lark import Lark, Tree
parser = Lark(
"""
?start: expr
?expr: or_test
?or_test: (or_test "or"i)? and_test
?and_test: (and_test "and"i)? cond
?cond: VAR "=" const | "(" expr ")"
?const: INT -> int
| string_raw -> string
?string_raw: STRING
STRING : /'[^']*'/
VAR: (NAME "-")? NAME
%import common.CNAME -> NAME
%import common.WS_INLINE
%import common.INT
%ignore WS_INLINE
""",
)
def print_tree(t, level=0):
if type(t) == Tree:
print(level * " " + t.data)
for c in t.children:
print_tree(c, level=level + 1)
else:
print(level * " " + str(t))
print_tree(parser.parse("my-data='abc\"' AND (param1=123 OR param2='test')"))
Такой простой парсер на выходе дает такое дерево:
and_test
cond
my-data
string
'abc"'
or_test
cond
param1
int
123
cond
param2
string
'test'