对于一些基于搜索的代码(Python),我需要编写查询语法解析的,将分析的一种简单的谷歌等的查询语法。例如:

所有这些词语"这个短语" 或,或这个网站:内。网站 filetype:ps:lastweek

作为搜寻变得更加一个更受欢迎,我期望能够很容易地找到蟒蛇图书馆这样做,并因此避免具有重新发明轮子。可悲的是,在谷歌上搜索不会产生多。

什么你会推荐作为一个python分析图书馆对这项简单的任务?

有帮助吗?

解决方案

虽然ply是一个更经典的方法(lexx + YACC的Python的变体),因此可能更容易上手,如果你已经熟悉了这样的传统工具,的 pyparsing 是非常符合Python和将是我的首荐,尤其对于这种简单的任务(这是真的更像乐星‘全面爆发’的解析......至少直到要允许可能嵌套括号,但pyparsing不会真的受到这些困扰要么; - )

其他提示

<强> 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是不是一个“玩具” - 虽然这是递归下降,它包括memoisation和蹦床,这有助于避免一些这种方法的局限性

然而,这是纯Python,所以它不是超级快,而且它在积极发展(一个新的版本,4.0,具有相当多的修复和改进,相对即将推出)。

几个不错的选择:

  • 嗖:唯一的问题是,他们有几分析实例,因为分析器可能不是它的主要特点/关注,但这绝对是一个很好的选择

  • modgrammar:我没有尝试,但它似乎相当灵活和简单的

  • 帘布层

  • pyparsing:强烈建议。有一些很好的分析的例子网上

如果你完成的项目中,什么你最终选择?

PLY 是巨大的。它是基于莱克斯/ Yacc的成语,因此可能已经熟悉了。它允许你创建任意复杂的词法分析器和解析器的任何任务,包括一个你需要的。

使用像层的,而不是简单的玩具一个强大的工具,是一个好主意,因为你的需求可以随时间变得更加复杂,你想留在相同的工具。

PyParsing将是正确的选择,虽然是相当繁琐的,为什么我已开发启发Lucene的和Gmail语法查询解析器多数民众赞成。它唯一的依赖是PyParsing,我们已经用它在几个项目。它是完全可定制和扩展,加上它抽象您从pyparsing问题。你可以看看这里:

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

它非常有据可查的,所以你会发现怎么办查询文档,CONFIGS等。

嗖有一个全面的搜索查询分析程序模块嗖.qparser和类QueryParser,应该是合理的容易适应你的使用情况。

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

我知道这是一个老问题,但以供将来参考我刚刚上传我的包 searchstringparser 的PyPI 。它实现了基于一个体面的查询解析机械。它输出适合的PostgreSQL功能tsquery的字符串。你可以看一下词法和语法分析器课程,看看是否符合您的需要或相应修改

信息反馈欢迎!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top