[英]Is there a library or spec for parsing complex string-based queries
已经看到一些REST API的非常常见的模式,用于通过传递组合字符串来处理过滤
此类示例之一: https : //www.algolia.com/doc/api-reference/api-parameters/filters/?language=python#examples
available = 1 AND (category:Book OR NOT category:Ebook) AND _tags:published AND publication_date:1441745506 TO 1441755506 AND inStock > 0 AND author:"John Doe"
示例available = 1 AND (category:Book OR NOT category:Ebook) AND _tags:published AND publication_date:1441745506 TO 1441755506 AND inStock > 0 AND author:"John Doe"
是否有一个好的规范或解析库来处理类似这样的事情,该库可以采用这样的字符串并将其解析为可以映射到查询的结构?
使用任何不错的常规解析库,您都可以构建一个解析器来解析这样的语言。 由于这是一种表达语言,我建议您使用一些具有声明性关联性和优先级规范的自下而上的算法。
例如,在parglare (公开:我是作者)中,它将类似于:
from parglare import Grammar, Parser
grammar = r'''
S: E EOF;
E: Term | And | Not | Or | To | Parent;
And: left=E 'AND' right=E;
Or: left=E 'OR' right=E;
Not: 'NOT' val=E;
To: from=E 'TO' to=BASETYPE;
Parent: '(' E ')' {9};
Term: name=ID TermOp value=BASETYPE {10};
TermOp: ':' | '=' | '>' | '<' | '<=' | '>=';
BASETYPE: NUM | STRING | ID;
terminals
NUM: /\d+(\.\d+)?/;
ID: /[a-zA-Z_][_a-zA-Z0-9]*/;
STRING: /("(\\"|[^"])*")|(\'(\\\'|[^\'])*\')/;
'''
g = Grammar.from_string(grammar)
parser = Parser(g)
out = parser.parse(r'''
available = 1 AND (category:Book OR NOT category:Ebook)
AND _tags:published
AND publication_date:1441745506 TO 1441755506
AND inStock > 0 AND author:"John Doe"
''')
out
参考将是一个很好的对象模型,它是从上面的语法推导出来的。 您可以在调试器中对其进行研究以获得感觉。 我不了解全部语言,因为我不知道,但您明白了。
现在,扩展此示例以支持完整的语言,并使给定结构的映射程序与查询相对容易。
如果使用parglare动作将已解析的输入直接转换为所需的输出,则将更加简单。 您可以在docs中阅读有关它的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.