Pyparsing позволяет легко определить синтаксический анализатор выражений для этого вида нотации. Думайте о ваших ключевых словах AND, OR и т. Д., Как будто они были операторами, а ваши термины, такие как «безопасность» и т. Д., Как операнды в грамматике инфиксной нотации, и вы можете использовать генератор грамматики pyparsing infixNotation
для определения вашего синтаксического анализатора:
sample = "security OR ((internet OR online OR paperless) AND (bank*)) AND (mobile OR cell OR phone OR access) OR easy OR online WITHIN bank OR transaction OR mumbai OR delhi NEAR/10 agar OR (online OR internet) AND (bank) OR not OR (apple) EXCLUDE (mongo)"
import pyparsing as pp
# enable packrat parsing, since this infix notation gets more complex than usual
pp.ParserElement.enablePackrat()
term = pp.Word(pp.alphas + '*')
SLASH = pp.Suppress('/')
AND = pp.Keyword("AND")
OR = pp.Keyword("OR")
WITHIN = pp.Keyword("WITHIN")
EXCLUDE = pp.Keyword("EXCLUDE")
NEAR_op = pp.Group(pp.Keyword("NEAR") + SLASH + pp.pyparsing_common.integer)
expr = pp.infixNotation(term,
[
(NEAR_op, 2, pp.opAssoc.LEFT),
(WITHIN, 2, pp.opAssoc.LEFT),
(AND, 2, pp.opAssoc.LEFT),
(OR, 2, pp.opAssoc.RIGHT),
(EXCLUDE, 2, pp.opAssoc.LEFT),
])
expr.parseString(sample).pprint()
Печать:
[[['security',
'OR',
[[[['internet', 'OR', ['online', 'OR', 'paperless']], 'AND', 'bank*'],
'AND',
['mobile', 'OR', ['cell', 'OR', ['phone', 'OR', 'access']]]],
'OR',
['easy',
'OR',
[['online', 'WITHIN', 'bank'],
'OR',
['transaction',
'OR',
['mumbai',
'OR',
[['delhi', ['NEAR', 10], 'agar'],
'OR',
[[['online', 'OR', 'internet'], 'AND', 'bank'],
'OR',
['not', 'OR', 'apple']]]]]]]]],
'EXCLUDE',
'mongo']]
(Отказ от ответственности: я автор pyparsing.)
Страница GitHub: https://github.com/pyparsing/pyparsing
Документы: https://pyparsing -docs.readthedocs.io / en / latest /
Установка: pip install pyparsing