2012-09-05 4 views
1

나는 짧은 문자열 목록이 길고이 항목들을 (일반적으로) 긴 텍스트 문자열로 검색하려고합니다. 내 목록은 ~ 500 짧은 문자열의 길이가 있고 나는 파이썬을 사용하여 ~ 10,000 자 정도의 원본 텍스트에서 발생하는 모든 것을 찾고 싶습니다. 여기 파이썬에서 텍스트 본문에서 여러 항목을 검색하는 가장 빠른 방법

내 문제에 대한 간단한 예입니다

cleanText = "four score and seven years ago our fathers brought forth on this continent a new nation conceived in Liberty and dedicated to the proposition that all men are created equal" 
searchList = ["years ago","dedicated to","civil war","brought forth"] 

cleanText에서 발생 searchList의 항목을 찾기위한 나의 현재 방법은 다음과 같습니다

found = [phrase for phrase in searchList if phrase in cleanText] 

이 파이썬에서 가장 빠른 방법이 있나요? 정확하게 느리지는 않지만 크기가 클수록 (10,000자인 cleanText가있는 searchList의 500 개 항목) 필자는 원하는 것보다 조금 느린 것으로 보입니다.

+0

어떻게 든 귀하의 콘텐츠는 영구적입니까? 전체 텍스트 색인 생성 솔루션을 사용할 수 있습니까? –

답변

6

정규식을 사용해 볼 수 있습니다. 즉 큰 목록을 위해 일을 속도를 수 있습니다

import re 
found = re.findall('|'.join(searchList),cleanText) 

(물론,이 re의 목적을 위해 탈출해야합니다 searchList에서 아무것도 있다고 가정합니다.)


으로 지적 코멘트에 (감사 anijhaw하기 위해), 당신은을 통해 탈출을 수행 할 수 있습니다

found = re.findall('|'.join(re.escape(x) for x in searchList), cleanText) 

할 수도 있습니다 사전 컴파일이 더 재치 번 이상을 사용하게 될 경우 정규식 h re.compile 예 :. 이 솔루션은 찾을

regex = re.compile('|'.join(re.escape(x) for x in searchList)) 
found = regex.findall(cleanText) 

부인 경기를 겹치지.

+0

당신은 그 – anijhaw

+0

에 re.escape를 사용할 수 있으며, 한 번 이상 사용하지 않을 경우 정규 표현식을 컴파일 할 수 있습니다. – anijhaw

+0

@anijhaw - 미리 컴파일하면 re.escape 단계 만 수행하면됩니다. 're'는 효율성을 위해 내부적으로 처음 몇 개를 캐쉬하기 때문에 프로그램에서 regexes를 많이 사용하지 않습니다. – mgilson

관련 문제