我刚刚发现了http://code.google.com/p/re2,这是一个很有前途的库,它使用一种长期忽略的方式(Thompson NFA)来实现一个正常的表达式引擎,它比awk的可用引擎,Perl更快。或者Python。
所以我下载了代码并执行了通常sudo make install
的操作。但是,这个动作似乎只是将/usr/local/include/re2/re2.h
添加到我的系统中。似乎有一些`` .a file in addition, but then what is it with this
.a``扩展名?
我想使用Python中的re2(最好是Python 3.1),很高兴在发行版中看到像make_unicode_groups.py
这样的文件(可能只是在构建过程中使用过吗?)。然而,那些没有部署在我的机器上。
我如何使用Python中的re2?
更新两位友好的人指出我可以尝试从源代码构建DLL / * .so文件,然后使用Python的ctypes
库来访问这些文件。任何人都可以提供有用的指示如何做到这一点?我在这里几乎一无所知,尤其是第一部分(构建* .so文件)。
更新我还将这个问题(早些时候)发布到了re2 developers’ group,直到现在都没有回复(这是一个小组),而今天(有点人口稠密){ {3}}群组comp.lang.py。希望来自不同角落的人们可以相互联系。我的猜测是技术娴熟的人可以在他们的20%你的免费时间属于谷歌太时间片的几个小时内做到这一点;这会让我筋疲力尽。 是否有一种工具可以自动将C ++愚蠢地转换为Python需要连接的任何C语言?然后可能会得到一个可行的结果可以简化为聪明的工具链。
(咆哮)为什么这么难?认为在2010年我们仍然不能拥有我们丰富的软件,只是互相交谈。这是一个障碍,每当你想要从Python处理一些C代码时,你必须总是抓住这些链接位。这需要大量工作,但只提供特定于C代码版本和Python版本的扩展模块,因此它可以快速老化。(/ rant) 是否可以在不同的进程中运行这样的东西(比如我有一个re2可执行文件可以产生数据的结果,比如subprocess/Popen/communicate()
)?(这不应该是一个纯粹的命令行工具,每次需要时都需要打开一个进程,但是一个连续运行的进程;也许存在那些“妖魔化”这种C代码的包装器。
答案 0 :(得分:15)
David Reiss为re2组装了一个Python包装器。它没有Python的re模块的所有功能,但它是一个开始。它可以在这里找到:http://github.com/facebook/pyre2。
答案 1 :(得分:5)
可能是,轻松没有。查看re2.h,这是一个作为类公开的C ++库。有两种方法可以从Python中使用它。
1。)正如Tuomas所说,将其编译为DLL / so并使用ctypes。但是,为了从python中使用它,您需要将对象init和方法包装成c样式的externed函数。我在过去通过外部函数传递指向周围对象的ctypes来完成此操作。 “init”函数返回一个void指针,指向在每个后续方法调用中传递的对象。确实非常混乱。
2。)将它包装成一个真正的python模块。再次暴露给python的那些函数需要是extern“C”。一种选择是使用Boost.Python,这将简化这项工作。
答案 2 :(得分:3)
SWIG处理C ++(与ctypes不同),因此使用它可能更直接。
答案 3 :(得分:0)
您可以尝试将re2构建到自己的DLL中,并使用ctypes从该DLL调用函数。您可能需要在DLL中定义自己的入口点。