什么是类似谷歌搜索查询的优秀python解析器?

时间:2010-03-02 16:18:25

标签: python string-parsing

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

  

所有这些词语“用这句话”   或者说这个网站:在.site   filetype:ps from:lastweek

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

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

7 个答案:

答案 0 :(得分:8)

虽然ply是一种更经典的方法(lexx + yacc的Pythonic变体),因此如果您已熟悉此类传统工具,则可能更容易开始使用pyparsing pythonic并且将是我的最佳推荐,特别是对于这样简单的任务(这真的更像是lexing而不是“full-blown”解析...至少直到你想允许可能嵌套的括号,但pyparsing不会真正困扰由那些; - )。

答案 1 :(得分:3)

SORRY - 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,有相当多的修复和改进,即将推出)。

答案 2 :(得分:3)

一些不错的选择:

  • 飞快移动:唯一的问题是他们的解析示例很少,因为解析器可能不是它的主要功能/焦点,但它绝对是一个不错的选择

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

  • 帘布层

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

PyParsing将是正确的选择,虽然相当繁琐,这就是为什么我开发了一个灵感来自lucene和gmail语法的查询解析器。它唯一的依赖是PyParsing,我们在几个项目中使用它。它是完全可定制和可扩展的,并且它可以从pyparsing问题中抽象出来。你可以在这里查看:

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

它的文档很好,所以你会找到关于如何进行查询,配置等的文档。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

欢迎反馈!