什么是好的Python解析器用于类似Google的搜索查询?
我需要写一个查询语法解析器,用来解析一些类似谷歌搜索的简单查询语法,代码是用Python写的。比如说:
所有这些词 "带这个短语" 或者那个 或者这个 site:within.site 文件类型:ps 从:上周
随着搜索变得越来越流行,我本以为能轻松找到一个Python库来完成这个任务,这样就不用自己重新发明轮子了。可惜在谷歌上搜索并没有找到太多相关的内容。
你会推荐哪个Python解析库来完成这个简单的任务呢?
7 个回答
抱歉 - Lepl 不再开发了。
还有一个叫 LEPL 的东西 - http://www.acooke.org/lepl
这是我在早餐时写的一个快速解决方案:
pl6 src: python3 Python 3.1 (r31:73572, Oct 24 2009, 05:39:09) [GCC 4.4.1 [gcc-4_4-branch revision 150839]] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from lepl import * >>> >>> class Alternatives(Node): ... pass ... >>> class Query(Node): ... pass ... >>> class Text(Node): ... pass ... >>> def compile(): ... qualifier = Word() & Drop(':') > 'qualifier' ... word = ~Lookahead('OR') & Word() ... phrase = String() ... text = phrase | word ... word_or_phrase = (Optional(qualifier) & text) > Text ... space = Drop(Space()[1:]) ... query = word_or_phrase[1:, space] > Query ... separator = Drop(space & 'OR' & space) ... alternatives = query[:, separator] > Alternatives ... return alternatives.string_parser() ... >>> parser = compile() >>> >>> alternatives = parser('all of these words "with this phrase" ' ... 'OR that OR this site:within.site ' ... 'filetype:ps from:lastweek')[0] >>> >>> print(str(alternatives)) Alternatives +- Query | +- Text | | `- 'all' | +- Text | | `- 'of' | +- Text | | `- 'these' | +- Text | | `- 'words' | `- Text | `- 'with this phrase' +- Query | `- Text | `- 'that' `- Query +- Text | `- 'this' +- Text | +- qualifier 'site' | `- 'within.site' +- Text | +- qualifier 'filetype' | `- 'ps' `- Text +- qualifier 'from' `- 'lastweek' >>>
我想说 LEPL 不是一个“玩具” - 虽然它使用的是递归下降的方法,但它还加入了记忆化和跳板技术,这些可以帮助克服这种方法的一些局限性。
不过,它是纯 Python 写的,所以速度不是特别快,而且它还在积极开发中(一个新的版本 4.0,包含了不少修复和改进,快要发布了)。
这里有几个不错的选择:
Whoosh:唯一的问题是它的解析示例不多,因为解析器可能不是它的主要功能,但绝对是个好选择。
modgrammar:我没试过,但看起来挺灵活和简单的。
ply
pyparsing:强烈推荐。网上有一些很好的解析示例。
如果你已经完成了这个项目,你最后选择了哪个呢?
虽然 ply
是一种比较传统的方法(可以看作是 lexx + yacc 的 Python 版本),如果你对这些传统工具已经有些了解,使用起来可能会更简单。不过,我更推荐 pyparsing,因为它非常符合 Python 的风格,特别适合处理一些简单的任务(这些任务其实更像是词法分析,而不是“全面”的解析……至少在你想处理可能嵌套的括号之前,但其实 pyparsing 对这些也不会有太大问题;-)。