sintaxis regular python regex re2

regular - ¿Es posible usar re2 desde Python?



re2 regular expression (4)

David Reiss ha reunido una envoltura de Python para re2. No tiene todas las funciones del módulo re de Python, pero es un comienzo. Está disponible aquí: http://github.com/facebook/pyre2 .

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

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

Me gustaría usar re2 de Python (preferiblemente Python 3.1) y me entusiasmó ver archivos como make_unicode_groups.py en la distro (¿quizás solo se usó durante el proceso de compilación?). Sin embargo, esos no fueron implementados en mi máquina.

¿Cómo puedo usar re2 de Python?

la actualización dos personas amigables han señalado que podría intentar crear archivos DLL / * .so a partir de las fuentes y luego usar la biblioteca de ctypes de Python para acceder a ellos. ¿Alguien puede dar consejos útiles sobre cómo hacer eso? Estoy bastante desorientado aquí, especialmente con la primera parte (compilación de archivos * .so).

actualizar también he publicado esta pregunta (anteriormente) al grupo de desarrolladores re2 , sin responder hasta ahora (es un grupo pequeño), y hoy al grupo comp.lang.py (algo más poblado) [—hilo aquí—] . La esperanza es que personas de varios rincones puedan contactarse entre sí. Mi conjetura es que una persona capacitada puede hacer esto en unas pocas horas durante su 20% de su tiempo libre pertenece también a google; Me ataría por semanas. ¿Existe una herramienta para reducir automáticamente C ++ a cualquier sabor de C que Python necesite para poder conectarse? luego, tal vez obtener un resultado viable puede reducirse a un inteligente encadenamiento de herramientas.

(Rant) ¿Por qué es esto tan difícil? pensar que en 2010 todavía no podemos tener nuestras piezas de software abundantes, solo hablar entre nosotros. este es un obstáculo que, cada vez que quiera abordar algún código C de Python, siempre debe cruzar estos bits de enlace. esto requiere mucho trabajo, pero solo ofrece 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 se envejece rápidamente. (/ rant) sería posible ejecutar tales cosas en procesos separados ( diga si tengo un ejecutable re2 que puede producir resultados para los datos que vienen en, por ejemplo, subprocess/Popen/communicate() )? (esta no debe ser una herramienta de línea de comandos pura que requiere la apertura de un proceso cada vez que se necesita, sino un proceso único que se ejecuta de manera continua; tal vez existen envoltorios que tipo de "demonizan" dicho código C)


Podría intentar construir re2 en su propia DLL / so y usar ctypes para llamar a funciones desde esa DLL / so. Probablemente necesitará definir sus propios puntos de entrada en la DLL / so.


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

1.) Como dice Tuomas, compílelo como un DLL / so y use ctypes. Sin embargo, para usarlo desde Python, necesitaría envolver el objeto init y los métodos en funciones de estilo C externas. He hecho esto en el pasado con ctypes mediante funciones externas que pasan un puntero al objeto. La función "init" devuelve un puntero nulo al objeto que se pasa en cada llamada de método subsiguiente. De hecho muy desordenado.

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


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