gpt4 book ai didi

python - 流中的 findall/finditer?

转载 作者:太空狗 更新时间:2023-10-30 02:49:05 25 4
gpt4 key购买 nike

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

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

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

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

谢谢!

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

最佳答案

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

然后你可以简单地做

for line in file:
result = re.finditer(regex, line)
# do something...

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

编辑:

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

编辑 2:

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

关于python - 流中的 findall/finditer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9769504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com