Следующий код анализирует выражение в скобках, которое похоже на выражение объекта 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