使用Python可以使用re2吗?

22

我刚刚发现了一个很有前途的库 - http://code.google.com/p/re2,它使用一种长期被忽视的方法 (Thompson NFA) 来实现正则表达式引擎,速度比 awk、Perl 或 Python 中的可用引擎快上几个数量级。

于是我下载了代码并使用了常规的 sudo make install 命令进行安装。 然而,这个操作似乎只是将 /usr/local/include/re2/re2.h 添加到了我的系统中。此外还有一些像 *.a 的文件,但是带有这个 *.a 后缀的文件是什么呢?

我想从 Python (最好是 Python 3.1) 中使用 re2,并很高兴看到发行版中有像 make_unicode_groups.py 这样的文件(也许只在编译过程中使用?)。 但是这些文件没有在我的计算机上部署。

如何从 Python 中使用 re2?


更新 有两位友善的人指出我可以尝试从源代码构建 DLL / *.so 文件,然后使用 Python 的 ctypes 库访问这些文件。有没有人可以给出有用的指针如何做到这一点? 我对此毫无头绪,尤其是对于第一部分(构建 *.so 文件)。


更新:我之前也在re2开发者组发布了这个问题,但至今没有得到回复(这是一个小组),今天我又发布到(规模稍微大一些的)comp.lang.py组中[—链接在此—]。希望来自各方面的人们能够联系到彼此。我猜一个有技能的人可以在他们20%的空闲时间内用几个小时完成这个任务,而这对我来说要花费几周的时间。是否有工具可以将C++自动转换为Python所需的任何C语言风格?然后,也许将获得可行的结果减少到巧妙的工具链接。

(牢骚)为什么这么难?想想在2010年我们仍然不能让我们丰富的软件片段相互通信。每当你想要从Python调用一些C代码时,你必须总是添加这些链接部分。这需要很多工作,但只提供一个特定于C代码版本和Python版本的扩展模块,因此它会很快过时。(/牢骚)是否有可能在单独的进程中运行这些东西(例如,如果我有一个re2可执行文件,可以为到达的数据生成结果,比如说subprocess/Popen/communicate())?(这不应该是一个纯命令行工具,每次需要用到它都必须打开一个进程,而是一个连续运行的单个进程;也许存在一些包装器,可以使这样的C代码“守护”)。


1
只翻译文本内容:+1 只是为了链接到 Thompson NFA 文章。 - President James K. Polk
请查看re2项目中的Makefile,并修改它以构建一个so文件。然后将您自己的文件添加到Makefile中,以提供re2和Python ctypes之间的接口。您必须使用-shared选项来构建so文件。只需在Google上搜索Makefile和共享库即可。 - Tuomas Pelkonen
1
@GregS:google(“Glushkov NFA”) - John Machin
// 默认情况下,模式和输入文本被解释为UTF-8。 // RE2 :: Latin1选项会将它们解释为Latin-1。看起来对我来说像是遗留软件 :-( - John Machin
顺便提一下,AWK使用了汤普森NFA方法;GAWK已经使用了几十年了。只有“现代”语言在这方面表现不佳。 - David Manheim
5个回答

15

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


这是我一直期望的答案。非常感谢! - flow
10
请注意,Facebook的端口非常基础和不完整。您最好使用其中一个分支,例如 https://github.com/axiak/pyre2。 - itsadok

5
可能是可以的,但并不容易。看一下re2.h文件,这是一个作为类公开的C++库。你可以有两种方式从Python中使用它。
1.) 如Tuomas所说,将其编译为DLL / so并使用ctypes。但是,为了从Python中使用它,你需要将对象init和方法封装成c样式的外部函数。我以前用ctypes做过这个,通过传递指向对象的指针来extern函数。 "init"函数返回一个void指针到每个后续方法调用中传递的对象。非常混乱。
2.) 将其封装成真正的Python模块。同样,那些暴露给Python的函数需要是extern"C"。一种选择是使用Boost.Python,这将简化这项工作。

3

SWIG 可以处理 C++(不像 ctypes),因此使用它可能更加直接简单。


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

0

您可以使用Python包https://pypi.org/project/google-re2/。不过请注意,在安装Python包之前,需要自行安装一些必要的依赖项,请查看底部的说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接