parser into python string-parsing

into - ¿Qué es un buen analizador de Python para una consulta de búsqueda similar a Google?



split list python (7)

Para algunos códigos basados ​​en búsquedas (en Python), necesito escribir un analizador de sintaxis de consulta que analice una sintaxis de consulta similar a Google. Por ejemplo:

todas estas palabras "con esta frase" O que OR este sitio: within.site filetype: ps desde: lastweek

A medida que la búsqueda se vuelve más popular, esperaba poder encontrar fácilmente una biblioteca de Python para hacer esto y así evitar tener que reinventar la rueda. Lamentablemente, las búsquedas en google no dan mucho.

¿Qué recomendaría usted como una biblioteca de análisis de Python para esta tarea simple?


Algunas buenas opciones:

  • Whoosh: el único problema es que tienen pocos ejemplos de análisis, ya que el analizador podría no ser su principal característica / enfoque, pero definitivamente es una buena opción

  • modgrammar: no lo intenté, pero parece bastante flexible y simple

  • capa

  • Pyparsing: muy recomendado. Hay algunos buenos ejemplos de análisis en línea

Si terminaste con el proyecto, ¿qué terminaste eligiendo?


PyParsing sería la elección correcta, aunque es bastante tedioso, por eso he desarrollado un analizador de consultas inspirado en la sintaxis de Lucene y Gmail. Solo la dependencia es PyParsing, y la hemos usado en varios proyectos. Es totalmente personalizable y ampliable, además de que te abstrae de los problemas de publicación. Puede verificarlo aquí:

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

Está bastante bien documentado, por lo que encontrará documentos sobre cómo realizar consultas, configuraciones, etc.


Sé que esta es una pregunta antigua, pero para futuras referencias acabo de cargar mi paquete searchstringparser en PyPi . Lo que implementa una maquinaria de análisis de consulta decente basada en la ply . Da salida a una cadena adecuada para la función PostgreSQL tsquery. Puede consultar las clases de lexer y analizador para ver si se ajustan a sus necesidades o modificarlas en consecuencia.

Comentarios bienvenidos!



PLY es genial. Se basa en el lenguaje Lex / Yacc y, por lo tanto, puede que ya esté familiarizado. Le permite crear analizadores y analizadores arbitrariamente complejos para cualquier tarea, incluida la que necesita.

Usar una herramienta poderosa como PLY en lugar de un juguete simple es una buena idea, ya que sus necesidades pueden volverse más complejas con el tiempo y le gustaría quedarse con la misma herramienta.


Lo siento - Lepl ya no se está desarrollando.

También hay LEPL - http://www.acooke.org/lepl

Aquí hay una solución rápida que escribí durante el desayuno:

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'' >>>

Yo diría que LEPL no es un "juguete", aunque es un descenso recursivo, incluye memoisation y trampolining, que ayudan a evitar algunas de las limitaciones de ese enfoque.

Sin embargo, es Python puro, por lo que no es súper rápido, y está en desarrollo activo (una nueva versión, 4.0, con algunas correcciones y mejoras, llegará relativamente pronto).


Si bien la ply es un enfoque más clásico (una variante de Pythonic de lexx + yacc) y, por lo tanto, puede ser más fácil comenzar si ya está familiarizado con estas herramientas tradicionales, el uso de pyparsing es altamente pythonic y sería mi principal recomendación, especialmente para tales tareas sencillas (que en realidad son más parecidas a un lexing que a un análisis "en toda regla" ... al menos hasta que desee permitir paréntesis posiblemente anidados, pero el parpadeo no se verá afectado por ellos ;-).