什么是好的Python解析器用于类似Google的搜索查询?

18 投票
7 回答
8829 浏览
提问于 2025-04-15 19:55

我需要写一个查询语法解析器,用来解析一些类似谷歌搜索的简单查询语法,代码是用Python写的。比如说:

所有这些词 "带这个短语" 或者那个 或者这个 site:within.site 文件类型:ps 从:上周

随着搜索变得越来越流行,我本以为能轻松找到一个Python库来完成这个任务,这样就不用自己重新发明轮子了。可惜在谷歌上搜索并没有找到太多相关的内容。

你会推荐哪个Python解析库来完成这个简单的任务呢?

7 个回答

3

抱歉 - 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,包含了不少修复和改进,快要发布了)。

4

这里有几个不错的选择:

  • Whoosh:唯一的问题是它的解析示例不多,因为解析器可能不是它的主要功能,但绝对是个好选择。

  • modgrammar:我没试过,但看起来挺灵活和简单的。

  • ply

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

如果你已经完成了这个项目,你最后选择了哪个呢?

8

虽然 ply 是一种比较传统的方法(可以看作是 lexx + yacc 的 Python 版本),如果你对这些传统工具已经有些了解,使用起来可能会更简单。不过,我更推荐 pyparsing,因为它非常符合 Python 的风格,特别适合处理一些简单的任务(这些任务其实更像是词法分析,而不是“全面”的解析……至少在你想处理可能嵌套的括号之前,但其实 pyparsing 对这些也不会有太大问题;-)。

撰写回答