python: парсинг запросов с заданным словарем

есть текстовая строка типа

text = "my-data='ab\"c x\'yz' AND (param1=123 OR param2='test')"

хотелось бы ее корректно распарсить

  1. минимум получить значение по полю (т.е. на выходе после парсинга есть какой-нибудь словарь с ключами и значениями

  2. получить и логику (т.е. после парсинга будет некоторое дерево где 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'
→ Ссылка