С любой приличной библиотекой общего синтаксического анализа вы можете создать синтаксический анализатор, который анализирует языки, подобные этому Поскольку это язык выражений, я бы предложил использовать некоторый восходящий алгоритм с декларативной ассоциативностью и спецификацией приоритета.
Например, в parglare (раскрытие: я автор) это будет что-то вроде:
from parglare import Grammar, Parser
grammar = r'''
S: E EOF;
E: Term | And | Not | Or | To | Parent;
And: left=E 'AND' right=E;
Or: left=E 'OR' right=E;
Not: 'NOT' val=E;
To: from=E 'TO' to=BASETYPE;
Parent: '(' E ')' {9};
Term: name=ID TermOp value=BASETYPE {10};
TermOp: ':' | '=' | '>' | '<' | '<=' | '>=';
BASETYPE: NUM | STRING | ID;
terminals
NUM: /\d+(\.\d+)?/;
ID: /[a-zA-Z_][_a-zA-Z0-9]*/;
STRING: /("(\\"|[^"])*")|(\'(\\\'|[^\'])*\')/;
'''
g = Grammar.from_string(grammar)
parser = Parser(g)
out = parser.parse(r'''
available = 1 AND (category:Book OR NOT category:Ebook)
AND _tags:published
AND publication_date:1441745506 TO 1441755506
AND inStock > 0 AND author:"John Doe"
''')
out
ссылка в конце будет хорошей объектной моделью, выведенной из грамматики выше. Вы можете исследовать это в отладчике, чтобы почувствовать. Я не охватил весь язык, так как не знаю, но вы поняли.
Теперь было бы относительно легко расширить этот пример для поддержки полного языка и сделать отображение данной структуры для запроса.
Было бы еще проще, если бы вы использовали parglare действия для непосредственного преобразования анализируемого ввода в желаемый вывод. Подробнее об этом вы можете прочитать в документах .