2010-03-13 21 views
22

Acabo de descubrir http://code.google.com/p/re2, una biblioteca prometedora que utiliza una forma largamente descuidada (Thompson NFA) para implementar un motor de expresiones regulares que puede ser órdenes de magnitudes más rápido que los motores disponibles de awk, Perl o Python.¿Es posible usar re2 desde Python?

así que descargué el código e hice la cosa habitual sudo make install. sin embargo, esa acción aparentemente no hizo más que agregar /usr/local/include/re2/re2.h a mi sistema. parecía haber alguna `` .a file in addition, but then what is it with this .a`` de extensión?

me gustaría usar re2 de Python (preferiblemente Python 3.1) y me entusiasmó ver archivos como make_unicode_groups.py en la distribución (¿tal vez solo se usó durante el proceso de compilación?). aquellos sin embargo no fueron desplegados en mi máquina.

¿cómo puedo usar re2 de Python?


actualización dos personas amigables han señalado que yo podría tratar de construir DLL/* .so archivos de las fuentes y luego utilizar ctypes la biblioteca de Python para acceder a ellos. ¿Alguien puede dar consejos útiles sobre cómo hacer exactamente eso? Aquí no tengo ni idea, especialmente con la primera parte (compilación de los archivos * .so).


actualización también he publicado esta pregunta (anterior) a la re2 developers’ group, sin respuesta hasta ahora (que es un grupo pequeño), y hoy a la (algo más poblada) comp.lang.py grupo [—thread here—]. la esperanza es que personas de diferentes rincones puedan contactarse entre sí. supongo que una persona capacitada puede hacer esto en unas pocas horas durante su 20% de tiempo de uso de tu-tiempo-libre-pertenece-google-demasiado; me ataría por semanas. ¿hay alguna herramienta para reducir automáticamente C++ al sabor de C que Python necesita para poder conectarse?, entonces tal vez obtener un resultado viable se puede reducir a un encadenamiento inteligente de herramientas.

(rant) ¿por qué es esto tan difícil? pensar que en 2010 todavía no podemos tener nuestras abundantes piezas de software solo para hablar entre nosotros. este es un obstáculo que siempre que quiera abordar algún código C de Python siempre debe crumble estos bits de enlace. esto requiere mucho trabajo, pero solo entrega un módulo de extensión que es específico para la versión del código C y la versión de Python, por lo que envejece rápidamente. (/ rant)¿Sería posible ejecutar tales cosas por separado? procesos (por ejemplo, si tuviera un ejecutable de Re2 que pueda generar resultados para los datos que entran, por ejemplo, subprocess/Popen/communicate())? (esto no debe ser una herramienta de línea de comandos pura que necesita la apertura de un proceso cada vez que se necesita, sino un proceso único que se ejecuta continuamente, tal vez existen contenedores que tipo de 'demonizar' dicho código C).

+1

+1 solo para el enlace al artículo de Thompson NFA –

+0

Verifique el archivo Make en el proyecto re2 y modifíquelo para crear un archivo so. A continuación, agregue sus propios archivos al Makefile para proporcionar la interfaz entre los tipos de cheros re2 y python. Debe usar la opción compartida para compilar los archivos so. Solo google para Makefile y bibliotecas compartidas. –

+1

@GregS: google ("Glushkov NFA") –

Respuesta

15

David Reiss ha creado un contenedor Python para re2. No tiene toda la funcionalidad del módulo re de Python, pero es un comienzo. Está disponible aquí: http://github.com/facebook/pyre2.

+0

esto es el tipo de respuesta que he estado esperando. ¡Una tonelada! – flow

+10

Tenga en cuenta que el puerto de Facebook es muy básico e incompleto. Está mucho mejor usando una de las horquillas, como https://github.com/axiak/ pyre2 – itsadok

0

Puede intentar construir re2 en su propia DLL/so y usar ctypes para llamar a funciones desde esa DLL/so. Probablemente necesite definir sus propios puntos de entrada en el DLL/so.

5

Posible sí, fácil no. Mirando la re2.h, esta es una biblioteca C++ expuesta como una clase. Hay dos formas de usarlo desde Python.

1.) Como dice Tuomas, compilarlo como una DLL/so y usar ctypes. Sin embargo, para usarlo desde Python, necesitaría envolver el objeto init y los métodos en funciones externas de estilo c. He hecho esto en el pasado con ctypes exterminando funciones que pasan un puntero al objeto alrededor.La función "init" devuelve un puntero de vacío al objeto que se pasa en cada llamada de método posterior. Muy desordenado de hecho.

2.) Envuélvalo en un verdadero módulo de python. De nuevo, las funciones expuestas a python tendrían que ser externas "C". Una opción es usar Boost.Python, que facilitaría este trabajo.

3

SWIG maneja C++ (a diferencia de ctypes), por lo que puede ser más sencillo usarlo.

Cuestiones relacionadas