2009-04-27 5 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')) 

이 일을 더 나은 더 effiecnt 방법이 있나요? 도와 주셔서 감사합니다.

답변

4

반복자는 다음 메소드가있는 객체 일뿐입니다. 이 함수를 호출 할 때마다 컬렉션의 다음 항목을 반환합니다. 임의의 인덱스에 액세스해야하는 경우 목록으로 변환해야합니다. 대신이의 :

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

당신은하지만이 말을 할 수

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

이 수행 거의 같은 일을. 그러나 큰 결과 집합에 대해 이렇게하는 것이 꽤 느리고 많은 메모리를 먹을 것이라고 경고해야합니다. 따라서 임의 액세스가 필요하지 않은 경우에는이 작업을 수행하지 않아야합니다. 신뢰할 수없는 사용자가 입력 한 데이터가 표시 될 결과의 수를 결정할 경우 입력 할 수있는 수를 제한 할 수도 있습니다.

수정 : 이전 답변이 게시 한 스 니펫과 동일하지 않은 것으로 나타났습니다. 그래서 업데이트했습니다.

+1

> 반복자는 다음 메소드가있는 객체 일뿐입니다. 아니 * 꽤 * 사실; iterator는 또한 동일한 iterator를 반환하는 'iter____'메소드를 가지고있다. (이미 iterable 인 iterable 버전을 얻기위한 내장 iter (foo) 함수를위한 하나의 인터페이스가있다.). – bignose