18

对于一些基于搜索的代码(在 Python 中),我需要编写一个查询语法解析器来解析一个简单的 google 之类的查询语法。例如:

所有这些词“带有这个短语”或那个或这个站点:within.site 文件类型:ps 来自:lastweek

随着搜索变得越来越流行,我希望能够轻松找到一个 python 库来执行此操作,从而避免重新发明轮子。可悲的是,在谷歌上的搜索并没有带来太多收益。

对于这个简单的任务,你会推荐什么作为 python 解析库?

4

7 回答 7

8

虽然ply是一种更经典的方法(lexx + yacc 的 Pythonic 变体),因此如果您已经熟悉此类传统工具,可能更容易上手,但pyparsing是高度 Pythonic 的,是我的首选,尤其是对于如此简单的任务(这实际上更像是词法分析而不是“成熟的”解析......至少在您想要允许可能嵌套的括号之前,但 pyparsing 也不会真正受到这些问题的困扰;-)。

于 2010-03-02T18:57:44.393 回答
4

几个不错的选择:

  • Whoosh:唯一的问题是他们几乎没有解析示例,因为解析器可能不是它的主要功能/重点,但它绝对是一个不错的选择

  • modgrammar:我没有尝试过,但它看起来非常灵活和简单

  • pyparsing:强烈推荐。网上有一些很好的解析例子

如果你完成了这个项目,你最终选择了什么?

于 2014-06-30T18:27:05.663 回答
3

抱歉 - Lepl 不再被开发。

还有 LEPL - http://www.acooke.org/lepl

这是我在早餐时写的一个快速解决方案:

pl6 源代码:python3                                                      
Python 3.1(r31:73572,2009 年 10 月 24 日,05:39:09)                         
[GCC 4.4.1 [gcc-4_4-branch revision 150839]] 在 linux2                
输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。
>>> 从 lepl 导入 *                                                
>>>                                                                   
>>> 类替代(节点):                                         
... 经过                                                          
...
>>> 类查询(节点):
... 经过
...
>>> 类文本(节点):
... 经过
...
>>> 定义编译():
... 限定符 = Word() & Drop(':') > '限定符'
... word = ~Lookahead('OR') & Word()
... 短语 = 字符串()
... 文本 = 短语 | 单词
... word_or_phrase =(可选(限定符)和文本)> 文本
... 空间 = Drop(Space()[1:])
... 查询 = word_or_phrase[1:, space] > 查询
... 分隔符 = Drop(空格 & 'OR' & 空格)
... 替代品 = 查询 [:, 分隔符] > 替代品
...返回alternatives.string_parser()
...
>>> 解析器 = 编译()
>>>
>>> Alternatives = parser('所有这些单词“带有这个短语”'
... 'OR that OR this site:within.site'
... 'filetype:ps from:lastweek')[0]
>>>
>>> 打印(str(替代))
备择方案
 +- 查询
 | +- 文字
 | | `-'全部'
 | +- 文字
 | | `-'的'
 | +- 文字
 | | `-'这些'
 | +- 文字
 | | `-'单词'
 | `- 文本
 | `- '用这句话'
 +- 查询
 | `- 文本
 | `-'那个'
 `- 查询
     +- 文字
     | `-'这个'
     +- 文字
     | +- 限定词“网站”
     | `-'在.site内'
     +- 文字
     | +- 限定符“文件类型”
     | `-'ps'
     `- 文本
         +- 限定词“来自”
         `-'上周'
>>>

我认为 LEPL 不是“玩具”——尽管它是递归下降,但它包括记忆和蹦床,这有助于避免这种方法的一些限制。

但是,它是纯 Python,所以速度不是很快,而且它正在积极开发中(一个新版本 4.0,有很多修复和改进,很快就会推出)。

于 2010-03-03T12:19:12.137 回答
3

PyParsing 将是正确的选择,虽然很乏味,这就是为什么我开发了一个受 lucene 和 gmail 语法启发的查询解析器。它唯一的依赖是 PyParsing,我们已经在几个项目中使用了它。它是完全可定制和可扩展的,而且它使您从 pyparsing 问题中抽象出来。你可以在这里查看:

http://www.github.com/sebastiandev/plyse

它有很好的文档记录,因此您会找到有关如何进行查询、配置等的文档。

于 2016-05-24T18:59:25.490 回答
2

PLY很棒。它基于 Lex/Yacc 习语,因此可能已经很熟悉了。它允许您为任何任务(包括您需要的任务)创建任意复杂的词法分析器和解析器。

使用像 PLY 这样强大的工具而不是简单的玩具是个好主意,因为随着时间的推移,您的需求会变得更加复杂,并且您希望继续使用相同的工具。

于 2010-03-02T16:23:06.427 回答
1

我知道这是一个老问题,但为了将来参考,我刚刚将我的包searchstringparser上传到PyPi。它基于ply实现了一个不错的查询解析机制。它输出一个适合 PostgreSQL 函数 tsquery 的字符串。您可以查看词法分析器和解析器类,看看它们是否符合您的需要或进行相应修改。

欢迎反馈!

于 2015-09-29T17:56:07.020 回答
0

Whoosh 有一个全面的搜索查询解析器模块 whoosh.qparser 和类 QueryParser 应该相当容易适应您的用例。

请参阅http://pythonhosted.org/Whoosh/parsing.htmlhttps://bitbucket.org/mchaput/whoosh/src/55f9c484047a8306101c8eaa59e9a110f960a1c2/src/whoosh/qparser

于 2013-08-20T09:40:15.040 回答