python - 是否有用于解析复杂的基于字符串的查询的库或规范
问题描述
已经看到一些 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"
对于这样的东西,是否有一个好的规范或解析库可以接受这样的字符串并将其解析为可以映射到查询的结构?
解决方案
使用任何体面的通用解析库,您都可以构建一个解析器来解析这样的语言。由于它是一种表达式语言,我建议使用一些具有声明性关联性和优先级规范的自下而上算法。
例如,在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中阅读有关它的更多信息。
推荐阅读
- docker - Docker - 将 yum install 添加到基础镜像
- angular - 如何使 Ag-grid 在 Storybook 中工作
- ruby-on-rails - 未定义的方法“页面”
- angular - Angular - 在继承中使用变量作为类型
- haskell - 如何理解 case 表达式?
- javascript - 否定 RegEx Javascript 中的一对字符
- sql-server - 将 0.77777 转换为 77.8,我使用的是 SQL Server
- javascript - TUI(Toast UI)日历 API 未按预期工作。
- xaml - xaml 元素如何继承 FontFamily 和 Foreground 等属性?
- angular - 使用地图向可观察对象添加值