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