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

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

Сообщение Anonymous »

Я изучаю потрясающий модуль Python для анализа pyparsing Пола МакГуайра. Я публикую это для обсуждения и, надеюсь, получить более глубокое представление о 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Использование pyparsing для анализа инфиксного выражения
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Использование pyparsing для анализа инфиксного выражения
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Используйте pyparsing для анализа выражения, начинающегося с скобок
    Гость » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Гость
  • Использование pyparsing для анализа выражений фильтра
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Использование pyparsing для анализа выражений фильтра
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous

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