Использование pyparsing для анализа инфиксного выраженияPython

Программы на Python
Anonymous
Использование pyparsing для анализа инфиксного выражения

Сообщение Anonymous »

В следующем коде используется pyparsing для анализа выражения в скобках, которое похоже на выражение объекта Django Q(), используемое для запроса данных. Вот пример выражения:

Код: Выделить всё

'( title__regex=r"^(An?|The) +" ) | ( id__in=[1, 3, 4] )'
Вот код:

Код: Выделить всё

import pyparsing as p

ident = p.Word(p.identchars, p.identbodychars)
cond_op = p.Opt('!') + '='
quoted_string = p.quoted_string
unquoted_string = p.Word(p.string.printable, exclude_chars='()\'"')
rvalue = p.OneOrMore(quoted_string | unquoted_string)
infix_operator = p.one_of('& | ^').set_name('"logical operator"')
whitespace = p.ZeroOrMore(p.White())
expr = p.infix_notation(
p.Combine(ident + whitespace + cond_op + whitespace + rvalue),
[(infix_operator, 2, p.opAssoc.LEFT)]
)

string = '( title__regex=r"^(An?|The) +" ) | ( id__in=[1, 3, 4] )'

try:
results = expr.parse_string(string, parse_all=True).as_list()
except p.ParseException as e:
print(e.explain())
else:
print(results)
Код правильно выводит:

Код: Выделить всё

[['title__regex=r"^(An?|The) +"', '|', 'id__in=[1, 3, 4]']]
Какие еще существуют решения?
Есть ли лучший способ выразить последовательность символов без кавычек и кавычек? Здесь кавычки не позволяют интерпретировать круглые скобки как конец или начало выражения в скобках.
Если я искажаю входную строку, удаляя символ =, т. е. title__regex r"^( An?|The) +", парсер возвращает:

Код: Выделить всё

    (title__regex r"^(An?|The) +") | (id__in=[1, 3, 4])
^
ParseException: Expected "logical operator" term, found 'r'  (at char 14), (line:1, col:15)
Почему парсер ожидает «логический оператор»? Следует ожидать "=".

Подробнее здесь: https://stackoverflow.com/questions/790 ... expression

Вернуться в «Python»