0

次のジェネレーター式を含むプログラムを作成しています (ご想像のとおり、「sep2」はコンパイルされた正規表現です)。

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

これはうまくいきます。しかし、大きな文字列を処理する代わりに、ファイルを 1 行ずつ処理する方が、プログラムのスケーラビリティが向上するのではないかと思いました。だから私は次のことを試しました:

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

残念ながら、これにより次のエラー メッセージがスローされます。

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

ここで、ファイルを 1 行ずつ処理するという考えをあきらめることができます。正直なところ、それは大したことではありません。しかし、ここで何がうまくいかないのか知りたいです。上記のエラー メッセージについて、stackoverflow (および Python の Web サイト、およびインターネット全般) を検索しましたが、関連すると思われるものは見つかりませんでした。私が知る必要があるのは、内部のジェネレーター式が生成する (私が推測する) 'callable-iterator' オブジェクトから一致オブジェクトを取得する方法だと思います。しかし、私は混乱しているかもしれません。私はあまりプログラマーではありません (プログラミングが役に立つと思っているだけです)。

御時間ありがとうございます。

4

1 に答える 1

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 に答える