2012-04-02 2 views
5

나는 유사성을 찾으려는 문자열이 많습니다 (각 문자열은 평균 30 자입니다). 나는 간단하고 결과가 좋았으므로 difflib'sSequenceMatcher이이 작업에 유용하다는 것을 알았습니다. 내가이difflib의 SequenceMatcher가 "정크"문자를 무시합니다.

>>> sm=SequenceMatcher(lambda x:x=='-','hellboy','hell-boy') 
>>> sm.ratio() 
0: 0.93333333333333335 

처럼 hellboyhell-boy을 비교하지만 나는 그런 말을 ratio of 1.0 즉 100 % 일치를주고 싶다. 위의 함수에서 지정된 쓰레기 문자는 비교를 위해 사용되지 않지만 가장 긴 연속 매칭 하위 시퀀스를 찾는 것을 이해합니다. SequenceMatcher을 "junk"문자로 무시할 수있는 방법이 있습니까??

+3

그것은 일종의 hackish의를 비교를하기 전에 _junk_ 문자를 제거 할 수없는 이유는 무엇입니까? 그것은 본질적으로 그것들을 무시하는 것과 같습니다. –

+0

예 thats good하지만 나는 단지'difflib' 마법을 수행하고 그것을 없애고 싶다면 다른 함수를 통해 문자열을 먼저 전달하여 모든 쓰레기 문자를 제거해야만 하는지를 알고 싶었습니다. – lovesh

답변

4

모든 정크 문자 사이의 경우 특별한 다시 문자가 전에 \를 넣어 (같은 *+) str.translate()을 사용하십시오.

예컨대 : here 도시 한 바와 같이,이 상당히입니다

to_compare = to_compare.translate(None, {"-"}) 

(3 배) 빨리 (내가 읽을 더 좋은 느낌) 정규식보다.

Python 3.x에서 또는 Python 2.x에서 유니 코드를 사용하는 경우 delchars 매개 변수가 허용되지 않으므로이 기능이 작동하지 않습니다. 이 경우, 없음으로 맵핑 만하면됩니다. 예 :

translation_map = str.maketrans({"-": None}) 
to_compare = to_compare.translate(translation_map) 

당신은 또한 당신이 제거 단지 세트를 만들어 통과 할 문자의 많은 경우 일부 입력을 저장하는 작은 기능을 할 수 :

def to_translation_map(iterable): 
    return {key: None for key in iterable} 
    #return dict((key, None) for key in iterable) #For old versions of Python without dict comps. 
1

당신이 손은 다시 사용하기 전에 모든 정크 문자를 제거하는 기능을한다면 : 단지를 넣어 정규 표현식 '-|_|\*'에 대한

string=re.sub('-|_|\*','',string) 

을 | 나는 가장 빠른 방법은합니다 (정크 문자를 제거), 코멘트에 제안 당신이하고자하는 경우