2009-04-27 79 views
3

我想使用正則表達式從一些聊天記錄中提取信息。被解析的字符串格式爲03:22:32 PM <b>blcArmadillo</b>。我使用python type()命令來查找變量消息是可調用迭代器。我的問題是我如何最有效地瀏覽可調用迭代器?他們喜歡數組,你可以只使用索引?我可以找到「提取」數據的唯一方法是循環返回的值並將它們添加到列表中,如下面的代碼snipet中所示。瀏覽Callable-Iterators

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] 

這確實幾乎同樣的事情。不過,我應該警告你,這樣做對於大型結果集來說會很慢,並且會吃掉一堆內存。因此,如果您不需要隨機訪問,則不應該這樣做。如果不受信任的用戶輸入的數據將決定將出現多少結果,那麼您可能還想限制它們可以輸入的內容的數量。

編輯:我剛剛注意到,我以前的回答與您發佈的代碼段不完全相同,所以我更新了它。

+1

>迭代器只是一個具有下一個方法的對象。 不*完全*爲真;一個迭代器也有一個'__iter__'方法,它返回相同的迭代器(這樣就可以通過內置的'iter(foo)'函數的一個接口來獲取對象的可迭代版本,即使是已經是迭代器的對象)。 – bignose 2009-04-27 05:49:36