2013-11-25 4 views
0

인터넷에서 정보를 가져 오는 스크립트가 있습니다. 긴 이야기를 짧게 줄이기 위해 문자열을 포함하는 변수가 있습니다. 이 문자열을 기반으로 나는 문자열에 관련하는 정보를 폐기 또는 추가 처리 여부를 결정하기 위해 스크립트를 프로그래밍 한 경우에 기반 :(Python) 문자열의 특정 용어를 필터링하는 가장 좋은 방법은 무엇입니까?

  • 내의 특정 순서로 특정 단어
  • 또는 단어 몇있다 문자열.

나는이 알고리즘을 효율적으로 그리고 100 % 정확한 정확도로 달성하는 것이 무엇인지 알고 싶습니다.

현재 나는 다음과 같은 코드가 (대규모 단지 특정 부분을 포함 감소를, 일반적으로 등, 등,이 문제를 해결 루프가) :

#!/usr/bin/env python 
import re 
def findWord(z): 
    return re.compile(r'\b({0})\b'.format(z), flags=re.IGNORECASE).search 

filterList = [ 
       "term-1","term-2","term-n" 
      ] 
uncleanString = "This! is* a test [string],.}".lower() 

#Remove all punctuation 
for c in "[email protected]#%&*()[]{}/?<>,.'": 
    cleanString = uncleanString.replace(c, "") 

#Check if the words in filterList are present, if not then process further 
no = 0 
for word in filterList: 
    result = findWord(filterList[filterList.index(word)])(cleanString) 
    if result == None: 
     pass 
    else: 
     no = 1 
     break 

    if no == 0: 
     #then do further processing here, e.g. 
     print(cleanString) 
     #reset condition (when implementing code in loop(s) 
     no = 0 

내 실제 스크립트에서 내 filterList이 크다. 이것은 느린 스크립트이고 30 분 정도 소요됩니다. 비록 이것이 (RPi와 PyPy가 아닌) 플랫폼 (BS4/HTTPlib)과의 통신 및 MySQL 데이터베이스 ... 다른 섹션을 수정하기 전에이 부분을 빠르게 할 수있는 방법에 대한 아이디어가 있습니까? 아니면 위의 내용이 적절하다고 말할 수 있습니까?

답변

-1

당신은 확실히, 더 읽기 쉽게 만들 수 있습니다 :

if not any(word in cleanString for word in filterList): 
    # further processing 

이 단계를 컴파일 문자열 서식 및 정규식을 잘라냅니다.

0

하나의 큰 정규 표현식을 번갈아 사용하십시오.

reg=re.compile(r'\b('+"|".join(filterList)+r')\b') 

은 findWord "대신, 하나 개의 정규 표현식 컴파일 된 객체에 한 번

전화를 모두있다, 당신은 용어 항목을 통해 루프가없는이

\b(term-1|term-2|term-n)\b 

것 같은데 "

reg.search 
관련 문제