我正在寻找一种方法来在Python中的(长)可迭代的“字符”上运行正则表达式。 (Python 实际上没有字符,因此它实际上是单长度字符串的可迭代。但差异相同。)
据我所知,re 模块仅允许搜索字符串(或缓冲区)。
我可以自己实现它,但这似乎有点愚蠢。
或者,我可以将可迭代对象转换为字符串并在该字符串上运行正则表达式,但这会导致(可怕的)低效。 (最坏情况的示例:re.search(".a", "".join('a' for a in range(10**8)))
峰值超过 900M RAM (私有(private)工作集)在我的(x64)机器上,并且需要大约 12 秒,即使它只需要查看可迭代中的前两个字符。)
最佳答案
据我了解,连接大量 '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 .
关于python - Python 有流式正则表达式模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23654867/