对于一些基于搜索的代码(在 Python 中),我需要编写一个查询语法解析器来解析一个简单的 google 之类的查询语法。例如:
所有这些词“带有这个短语”或那个或这个站点:within.site 文件类型:ps 来自:lastweek
随着搜索变得越来越流行,我希望能够轻松找到一个 python 库来执行此操作,从而避免重新发明轮子。可悲的是,在谷歌上的搜索并没有带来太多收益。
对于这个简单的任务,你会推荐什么作为 python 解析库?
对于一些基于搜索的代码(在 Python 中),我需要编写一个查询语法解析器来解析一个简单的 google 之类的查询语法。例如:
所有这些词“带有这个短语”或那个或这个站点:within.site 文件类型:ps 来自:lastweek
随着搜索变得越来越流行,我希望能够轻松找到一个 python 库来执行此操作,从而避免重新发明轮子。可悲的是,在谷歌上的搜索并没有带来太多收益。
对于这个简单的任务,你会推荐什么作为 python 解析库?
虽然ply
是一种更经典的方法(lexx + yacc 的 Pythonic 变体),因此如果您已经熟悉此类传统工具,可能更容易上手,但pyparsing是高度 Pythonic 的,是我的首选,尤其是对于如此简单的任务(这实际上更像是词法分析而不是“成熟的”解析......至少在您想要允许可能嵌套的括号之前,但 pyparsing 也不会真正受到这些问题的困扰;-)。
几个不错的选择:
Whoosh:唯一的问题是他们几乎没有解析示例,因为解析器可能不是它的主要功能/重点,但它绝对是一个不错的选择
modgrammar:我没有尝试过,但它看起来非常灵活和简单
层
pyparsing:强烈推荐。网上有一些很好的解析例子
如果你完成了这个项目,你最终选择了什么?
抱歉 - 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,有很多修复和改进,很快就会推出)。
PyParsing 将是正确的选择,虽然很乏味,这就是为什么我开发了一个受 lucene 和 gmail 语法启发的查询解析器。它唯一的依赖是 PyParsing,我们已经在几个项目中使用了它。它是完全可定制和可扩展的,而且它使您从 pyparsing 问题中抽象出来。你可以在这里查看:
http://www.github.com/sebastiandev/plyse
它有很好的文档记录,因此您会找到有关如何进行查询、配置等的文档。
PLY很棒。它基于 Lex/Yacc 习语,因此可能已经很熟悉了。它允许您为任何任务(包括您需要的任务)创建任意复杂的词法分析器和解析器。
使用像 PLY 这样强大的工具而不是简单的玩具是个好主意,因为随着时间的推移,您的需求会变得更加复杂,并且您希望继续使用相同的工具。
我知道这是一个老问题,但为了将来参考,我刚刚将我的包searchstringparser上传到PyPi。它基于ply实现了一个不错的查询解析机制。它输出一个适合 PostgreSQL 函数 tsquery 的字符串。您可以查看词法分析器和解析器类,看看它们是否符合您的需要或进行相应修改。
欢迎反馈!
Whoosh 有一个全面的搜索查询解析器模块 whoosh.qparser 和类 QueryParser 应该相当容易适应您的用例。
请参阅http://pythonhosted.org/Whoosh/parsing.html和https://bitbucket.org/mchaput/whoosh/src/55f9c484047a8306101c8eaa59e9a110f960a1c2/src/whoosh/qparser