【问题标题】:Is it possible to use re2 from Python?是否可以从 Python 中使用 re2?
【发布时间】:2011-01-27 05:11:07
【问题描述】:

我刚刚发现了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 developers’ group,直到现在没有回复(这是一个小团体),今天发布到(人口更多)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 代码的包装器。

【问题讨论】:

  • +1 只是为了获得 Thompson NFA 文章的链接
  • 签出re2项目中的Makefile并修改它构建一个so文件。然后将自己的文件添加到 Makefile 中,以提供 re2 和 python ctypes 之间的接口。您必须使用 -shared 选项来构建 so 文件。只需 google 即可获取 Makefile 和共享库。
  • @GregS: google("Glushkov NFA")
  • """// 默认情况下,模式和输入文本被解释为 UTF-8。 // RE2::Latin1 选项导致它们被解释为 Latin-1。""" 看起来对我来说就像遗留软件:-(
  • 顺便说一下,AWK使用的是Thompson NFA方法; GAWK 已经这样做了几十年。只有“现代”语言在这方面做得不好。

标签: python regex re2


【解决方案1】:

David Reiss 为 re2 组合了一个 Python 包装器。它没有 Python 的 re 模块的所有功能,但它是一个开始。可在此处获取:http://github.com/facebook/pyre2

【讨论】:

  • 这是我一直希望的答案。谢谢一吨!
  • 请注意,facebook 移植它非常基本且不完整。你最好使用其中一个分支,比如github.com/axiak/pyre2
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2018-08-12
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        • 2016-04-06
        • 1970-01-01
        • 2018-05-19
        • 2011-10-24
        相关资源
        最近更新 更多