Skip to main content
 首页 » 编程设计

python之有没有适用于 Python 的流式正则表达式模块

2024年11月01日29xxx_UU

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

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

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

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

请您参考如下方法:

据我了解,加入大量'a' 的示例只是显示问题的极其简单的示例。换句话说,内容的构建(通常)可能比搜索本身更耗费时间和内存。

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

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

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

想了解Thomsons的思路,也可以试试在线visualization of the Regular Expression to NFA .