22

我刚刚发现了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[-thread here-] . 希望各个角落的人可以互相联系。我的猜测是一个熟练的人可以在他们的 20% your-free-time-belongs-google-too 时间片内的几个小时内做到这一点;它会束缚我好几个星期。是否有一种工具可以自动将 C++ 简化为 Python 需要能够连接的任何 C 风格?那么也许得到一个可行的结果可以简化为聪明的工具链。

(咆哮)为什么这么难?想想2010年我们还是不能让我们丰富的软件互相交流。这是一个如此大的障碍,以至于无论何时你想从 Python 中处理一些 C 代码,你都必须总是处理这些链接位。这需要大量工作,但只提供了一个特定于 C 代码版本和 Python 版本的扩展模块,因此它老化得很快。(/rant) 是否可以在单独的进程中运行这些东西(假设我是否有一个 re2 可执行文件,它可以为传入的数据生成结果,比如subprocess/Popen/communicate())?(这不应该是一个纯粹的命令行工具,每次需要时都需要打开一个进程,而是一个连续运行的单个进程;也许存在某种“妖魔化”此类 C 代码的包装器)。

4

4 回答 4

15

David Reiss 为 re2 组装了一个 Python 包装器。它没有 Python 的 re 模块的所有功能,但它是一个开始。它可以在这里找到:http: //github.com/facebook/pyre2

于 2010-03-16T19:47:36.673 回答
5

可能是的,简单的不是。查看 re2.h,这是一个作为类公开的 C++ 库。有两种方法可以从 Python 中使用它。

1.) 正如 Tuomas 所说,将其编译为 DLL/so 并使用 ctypes。但是,为了从 python 中使用它,您需要将对象 init 和方法包装到 c 样式的外部函数中。我过去使用 ctypes 通过外部函数来完成此操作,这些函数将指针传递给周围的对象。“init”函数返回一个指向在每个后续方法调用中传递的对象的 void 指针。确实很乱。

2.) 将其包装成一个真正的 python 模块。同样,暴露给 python 的那些函数需要是 extern "C"。一种选择是使用Boost.Python,这将简化这项工作。

于 2010-03-13T18:46:36.000 回答
3

SWIG处理 C++(与 ctypes 不同),因此使用它可能更直接。

于 2010-03-13T18:50:03.380 回答
0

您可以尝试将 re2 构建到它自己的 DLL/so 中,并使用 ctypes 从该 DLL/so 调用函数。您可能需要在 DLL/so 中定义自己的入口点。

于 2010-03-13T18:06:16.607 回答