是否有适用于Python的流式正则表达式模块?

时间:2014-05-14 12:31:59

标签: python regex string python-3.x lazy-evaluation

我正在寻找一种在Python中对(长)可迭代的“字符”运行正则表达式的方法。 (Python实际上没有字符,所以它实际上是一个长度字符串的迭代。但是差别相同。)

据我所知,re模块只允许搜索字符串(或缓冲区)。

我可以自己实施,但这看起来有点傻。

或者,我可以将iterable转换为字符串并在字符串上运行正则表达式,但这会(非常)低效。 (最糟糕的例子:re.search(".a", "".join('a' for a in range(10**8)))在我的(x64)机器上超过900M的RAM(私人工作集)达到峰值,并且需要大约12秒,即使它只需要查看前两个字符可迭代。)

2 个答案:

答案 0 :(得分:2)

据我所知,加入大量'a'的示例只是一个非常简单的例子来说明问题。换句话说,内容的构造(通常)可能比搜索本身更耗费时间和内存。

标准re模块的问题在于它使用扩展的正则表达式语法,并且需要回溯。

您可能对Thomson(NFA)非常经典的实现感兴趣 - 请参阅http://swtch.com/~rsc/regexp/regexp1.html以获得解释以及性能与实现扩展语法的库的比较。

似乎re2项目对您有用。应该有Python端口 - 请参阅Is it possible to use re2 from Python?但是,我不知道它是否支持流式传输以及任何Python的流式正则表达式引擎都存在。

要了解汤姆森的想法,您还可以尝试在线visualization of the Regular Expression to NFA

答案 1 :(得分:0)

如果该列表中的元素数量确实达到了10 ** 8的数量级,那么如果您只想进行一次线性搜索,那么您可能会更好。否则,你必须创建这个非常低效的巨大字符串。如果您不止一次需要这样做,我可以想到的另一件事是将集合插入哈希表并更快地进行搜索。