2009-04-27 12 views
3

一部のチャットログから正規表現を使用して情報を抽出したいと考えています。パースされる文字列の形式は03:22:32 PM <b>blcArmadillo</b>です。私はPythonのtype()コマンドを使用して、可変メッセージが呼び出し可能イテレータであることを確認しました。私の質問は、コール可能なイテレータを最も効率的にナビゲートする方法です。彼らはあなたが単にインデックスを使うことができる配列のようなものですか?データを抽出する唯一の方法は、返された値をループして、以下のコードスニペットに示すようにリストに追加することでした。呼び出し可能イテレータの操作

times = [] 
messages = re.compile(r'(?P<time>..:..:.. ..).*?<b>(?P<usrname>.*?):</b>').finditer(search) 

for result in messages: 
    times.append(result.group('time')) 

もっと効果的なやり方がありますか?助けてくれてありがとう。

答えて

4

イテレータは、次のメソッドを持つオブジェクトに過ぎません。それを呼び出すたびに、コレクション内の次のアイテムが返されます。任意のインデックスにアクセスする必要がある場合は、それをリストに変換する必要があります。この代わりに:

for result in messages: 
    times.append(result.group('time')) 

あなたはこのかかわらを言うことができます。

times = [result.group('time') for result in messages] 

これはかなり同じことを行います。しかし、大きな結果セットでこれを行うのはかなり遅く、多量のメモリを消費することに注意してください。したがって、あなたがランダムアクセスを必要としない場合、これを行うべきではありません。信頼できないユーザーが入力したデータが表示される回数が決まる場合は、入力可能な数を制限することもできます。

EDIT:私の以前の回答はあなたが投稿したスニペットと全く同じではないことに気がついたので、私はそれを更新しました。

+1

>イテレータは、次のメソッドを持つオブジェクトに過ぎません。 Not * quite * true;イテレータには同じイテレータを返す '__iter__'メソッドもあります(イテレータであってもオブジェクトのiterableバージョンを取得するための組み込み 'iter(foo)'関数のための単一のインタフェースが存在するように) )。 – bignose

関連する問題