我刚刚发现 http://code.google.com/p/re2, ,一个很有前途的库,它使用了一种长期被忽视的方式(汤普森美国国家期货协会)来实现比 awk、Perl 或 Python 的可用引擎快几个数量级的正则表达式引擎。

所以我下载了代码并做了通常的事情 sudo make install 事物。然而,这一行动似乎只不过是增加了 /usr/local/include/re2/re2.h 到我的系统。好像有一些```。Afile in addition, but then what is it with this.a`` 扩展名?

我想使用Python(最好是Python 3.1)中的re2,并且很高兴看到像这样的文件 make_unicode_groups.py 在发行版中(也许只是在构建过程中使用?)。然而,这些并没有部署在我的机器上。

我如何使用Python中的re2?


更新 两个友好的人指出我可以尝试从源代码构建 DLL / *.so 文件,然后使用 Python ctypes 库来访问这些。任何人都可以提供有用的指导如何做到这一点吗?我在这里几乎一无所知,尤其是第一部分(构建 *.so 文件)。


更新 我也已将这个问题(之前)发布到 re2开发者小组, ,到目前为止还没有回复(这是一个小团体),今天到了(人口较多) 编译语言.py 团体 [——这里是线程——]. 。希望来自不同角落的人们能够互相联系。我的猜测是,一个熟练的人可以在 20% 的空闲时间属于 google 时间片内的几个小时内完成此操作;这会束缚我几个星期。 有没有一种工具可以自动将 C++ 简化为 Python 需要能够连接的任何 C 风格? 那么也许获得可行的结果可以简化为巧妙的工具链。

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

有帮助吗?

解决方案

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

其他提示

可能是,也很容易不是。查看 re2.h,这是一个作为类公开的 C++ 库。您可以通过两种方式从 Python 使用它。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top