是否有用于解析复杂的基于字符串的查询的库或规范

2024-06-16 13:39:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我们已经看到了一些restapi的一个非常常见的模式,它们通过传递一个组合字符串来处理过滤

一个这样的例子: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"

对于这样的东西,有没有一个好的规范或解析库,可以把这样的字符串解析成一个结构,然后映射到一个查询?你知道吗


Tags: and字符串httpscomapirestapidocwww
1条回答
网友
1楼 · 发布于 2024-06-16 13:39:51

使用任何合适的通用解析库,您都可以构建一个解析器来解析这样的语言。由于它是一种表达式语言,我建议使用一些具有声明性关联性和优先级规范的自底向上算法

例如,在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操作直接将解析的输入转换为所需的输出,那么就更简单了。您可以在the docs中了解更多信息。你知道吗

相关问题 更多 >