findall/finditer 在流上?

kjo*_*kjo 5 python regex stream

有没有办法将功能re.findall或更好的re.finditer功能应用于流(即打开文件句柄以供读取)?

请注意,我并不假设要匹配的模式完全包含在一行输入中(即允许多行模式)。我也不假设最大匹配长度。

确实,在这种通用性级别上,可以指定一个正则表达式,该正则表达式要求正则表达式引擎有权访问整个字符串(例如r'(?sm).*'),当然,这意味着必须将整个文件读入内存,但我目前并不关心这种最坏的情况。毕竟,完全有可能编写不需要将整个文件读入内存的多行匹配正则表达式

是否可以从已编译的正则表达式访问底层自动机(或内部使用的任何内容),为其提供字符流?

谢谢!

编辑:添加了有关多行模式和匹配长度的说明,以响应 Tim Pietzcker 和 rplnt 的答案。

Tim*_*ker 3

如果您知道正则表达式匹配永远不会跨越换行符,则这是可能的。

然后你可以简单地做

for line in file:
    result = re.finditer(regex, line)
    # do something...
Run Code Online (Sandbox Code Playgroud)

如果匹配可以跨越多行,则需要将整个文件读入内存。否则,您如何知道您的匹配是否已经完成,或者前面的某些内容是否会使匹配变得不可能,或者匹配是否只是因为文件读取得不够远而失败?

编辑:

理论上是可以做到这一点的。正则表达式引擎必须检查匹配尝试期间的任何时刻是否到达流当前读取部分的末尾,如果到达,则继续读取(可能直到 EOF)。但Python引擎不这样做。

编辑2:

我查看了 Python stdlibre.py及其相关模块。正则表达式对象的实际生成(包括其.match()方法和其他方法)是在 C 扩展中完成的。因此,除非您直接编辑 C 源代码并构建自己的 Python 版本,否则您无法访问它并对其进行猴子修补以处理流。