0

我正在编写一个涉及以下生成器表达式的程序(您可能会猜到,'sep2' 是一个已编译的正则表达式):

(chunk.group(1).strip(punctuation) for chunk in sep2.finditer(textString))

这工作正常。但是,我突然想到,如果不是使用大字符串,而是逐行处理文件,该程序将更具可扩展性。所以我尝试了以下方法:

(chunk.group(1).strip(punctuation) for chunk in (sep2.finditer(line) for line in file))

不幸的是,这会引发以下错误消息:

AttributeError: 'callable-iterator' object has no attribute 'group'

现在,我可以放弃逐行处理文件的想法——老实说,这没什么大不了的。但我很想知道这里出了什么问题。我已经在 stackoverflow(和 Python 网站,以及一般的互联网)中搜索了上面的错误消息,但没有找到任何似乎相关的内容。我认为我需要知道的是如何从内部生成器表达式(我假设)产生的“可调用迭代器”对象中获取匹配对象。但我可能只是感到困惑;我不是一个程序员(只是觉得编程有用的人)!

谢谢你的时间。

4

1 回答 1

1

您已经添加了额外的嵌套来迭代,但没有添加额外的迭代来处理数据。因此,为处理一系列块而编写的代码正在接收一系列块的序列(每行一个)。

代码应该看起来更像:

from itertools import chain

(chunk.group(1).strip(punctuation) 
 for chunk in chain.from_iterable(sep2.finditer(line) for line in file))

或者(在这个嵌套级别,明确表示更有意义 - 在您的“多合一”代码中很难看到问题,但在这里它“自动”工作,因为您避免创建嵌套生成器):

for line in file:
    for chunk in sep2.finditer(line):
        yield chunk.group(1).strip(punctuation)
于 2012-07-23T13:08:41.463 回答