可以在Python中使用re2吗?
我刚发现了一个很有前途的库,叫做 http://code.google.com/p/re2,它使用了一种被忽视已久的方法(Thompson NFA)来实现一个正则表达式引擎,这个引擎的速度可以比 awk、Perl 或 Python 的引擎快几个数量级。
于是我下载了代码,按照惯例执行了 sudo make install
。不过,这个操作似乎只是把 /usr/local/include/re2/re2.h
加到了我的系统中。还有一些 *.a
文件,但这个 *.a
后缀到底是什么呢?
我想在 Python 中使用 re2(最好是 Python 3.1),看到发行包里有像 make_unicode_groups.py
这样的文件我很兴奋(可能只是构建过程中用到的?)。不过,这些文件并没有在我的机器上部署。
我该如何在 Python 中使用 re2 呢?
更新 有两位友好的人提醒我可以尝试从源代码构建 DLLs / *.so 文件,然后使用 Python 的 ctypes
库来访问这些文件。有没有人能给我一些有用的建议,告诉我该怎么做?我对这方面几乎一无所知,尤其是第一部分(构建 *.so 文件)。
更新 我之前也把这个问题发到了 re2 开发者组,到现在还没有回复(这个组人不多),今天又发到了(人稍微多一点的) comp.lang.py 组 [—这里的讨论—]。希望不同地方的人能互相联系。我的猜测是,熟练的人可以在他们的 20% 自由时间里花几个小时做到这一点;而我可能要花几周的时间。 有没有工具可以自动把 C++ 简化成 Python 需要的某种 C 语言,以便连接? 这样的话,得到一个可用的结果可能就能简化为巧妙的工具链。
(抱怨)为什么这这么难?想想在 2010 年,我们仍然不能让我们丰富的软件之间互相沟通。这真是个障碍,每当你想从 Python 访问一些 C 代码时,总是得处理这些链接的麻烦。这需要很多工作,但最终只得到一个特定于 C 代码版本和 Python 版本的扩展模块,所以它很快就过时了。(/抱怨) 是否有可能在不同的进程中运行这些东西(比如说如果我有一个可以处理数据的 re2 可执行文件,通过 subprocess/Popen/communicate()
输入)? (这不应该是一个纯命令行工具,每次需要时都得打开一个进程,而是一个持续运行的单一进程;也许存在一些包装器可以让这样的 C 代码“守护进程化”)。
5 个回答
SWIG 可以处理 C++ 代码(而不是像 ctypes 那样),所以使用它可能会更简单一些。
可能可以,但不简单。看一下re2.h,这是一个以类的形式暴露出来的C++库。你可以通过两种方式在Python中使用它。
1.) 正如Tuomas所说,可以将其编译成DLL或so文件,然后使用ctypes。不过,要在Python中使用它,你需要把对象的初始化和方法封装成C风格的外部函数。我以前用ctypes做过这件事,就是把一些函数外部化,让它们可以传递对象的指针。这个“初始化”函数会返回一个指向对象的空指针,然后在后续的每次方法调用中传递这个指针。确实很麻烦。
2.) 把它封装成一个真正的Python模块。同样,这些暴露给Python的函数也需要用extern "C"来声明。一个选择是使用Boost.Python,这样可以简化这个工作。
David Reiss 制作了一个 Python 的封装工具,用来使用 re2 这个库。虽然它没有 Python 自带的 re 模块那么多功能,但这算是一个好的开始。你可以在这里找到它:http://github.com/facebook/pyre2。