2013-03-14 2 views
0

글쎄 두 문자열을 비교하거나 최소한 문자열에서 다른 문자열로 문자 시퀀스를 찾아야합니다. 두 문자열은 md5 파일을 포함하고 있습니다.파이썬에서 두 문자열을 비교하십시오.

내 현재 코드는 다음과 같습니다

def comparemd5(): 
    origmd5=getreferrerurl() 
    dlmd5=md5_for_file(file_name) 
    print "original md5 is",origmd5 
    print "downloader file md5 is",dlmd5 
    s = difflib.SequenceMatcher(None, origmd5, dlmd5) 
    print "ratio is:",s.ratio() 

내가 얻을 출력은 다음과 같습니다

원래의 MD5 [ '0430f244a18146a0815aa1dd40 12db46', '59739CCDA2F15D5AC16DB6695CAE3378' '0430f244a18146a0815aa1dd4012db46']

다운 파일입니다 md5는 59739ccda2f15d5ac16db6695cae3378

비율은 0.0

따라서! origmd5의 dlmd5와 일치하지만 어쨌든 그걸 찾지 못했습니다 ... 어딘가에 뭔가 잘못하고 있습니다 ... 제발 도와주세요 :/

+0

일치하는 md5 해시가 중요한 경우 해시가 해제되어 있어야합니다. 해시가 파일과 일치하지 않는 경우 일치합니까? – dm03514

+0

dlmd5는 비교할 문자열이 아닌 목록입니다. – iMom0

+0

어쩌면 내가 어떻게 작동하는지 모르겠다.하지만 왜'dlmd5 in origmd5'를 쓸 수 없는가? – Hoopdady

답변

0

기본적으로, idom if test_string in list_of_strings을 원합니다. 이 사건 이후에 문제가있는 것처럼

>>> originals = ['0430f244a18146a0815aa1dd4012db46', '0430f244a18146a0815aa1dd40 12db46', '59739CCDA2F15D5AC16DB6695CAE3378'] 
>>> test = '59739ccda2f15d5ac16db6695cae3378' 
>>> if test.lower() in (s.lower() for s in originals): 
... print '%s is match, yeih!' % test 
... 
59739ccda2f15d5ac16db6695cae3378 is match, yeih! 
+0

경이로움을 주었던 THanks :) – scandalous

0

이 보이는 문자에 일치되지 않은 : 당신은 대소 문자 구분을하지 않아도, 그래서 당신은 당신의 경우

if test_string.lower() in (s.lower() for s in list_of_strings) 

을 할 수 있습니다 같은데 . 시도 할 수 있습니다 :

def comparemd5(): 
    origmd5=[item.lower() for item in getreferrerurl()] 
    dlmd5=md5_for_file(file_name) 
    print "original md5 is",origmd5 
    print "downloader file md5 is",dlmd5 
    s = difflib.SequenceMatcher(None, origmd5, dlmd5) 
    print "ratio is:",s.ratio() 
+0

hmmm은 여전히 ​​일치하는 항목이없는 것 같습니다. 비율은 여전히 ​​0입니다. 아마도 목록의 일부분 일 수 있습니다. 첫 번째 항목과 만 비교하면됩니까? – scandalous

+0

나는 그것을 해결할 수있는 방법을 발견 Hoopdady, 나는 조인을 사용하여 하나의 문자열로 origmd5를 병합 후 비교. 지금 그것은 작동한다! 머리를 가져 주셔서 감사합니다. – scandalous

+0

시원하고 기쁘게 들립니다. – Hoopdady

0

입력 감안할 때 :

원래의 MD5는 [ '0430f244a18146a0815aa1dd4012db46을', '0430f244a18146a0815aa1dd40 12db46', '59739CCDA2F15D5AC16DB6695CAE3378']

다운 파일 MD5는 59739ccda2f15d5ac16db6695cae3378

입니다

두 가지 문제가 있습니다.

먼저 MD5가 아니라 MD5와 다른 두 가지가 있습니다.

수정하려면 origmd5이 항상이 형식이어야한다는 것을 알고 있다면 origmd5 대신 origmd5[2]을 사용하면됩니다. origmd5이 무엇인지 모르는 경우, 그 중 하나가 실제 MD5 인 경우를 제외하고는 모든 요소와 비교해야합니다.

둘째, 실제 MD5 값은 모두 동일한 이진 데이터를 나타내는 16 진수 문자열이지만 다른 16 진수 문자열입니다 (하나는 대문자이고 다른 하나는 소문자 임). 대소 문자를 구분하지 않고 비교하면이 문제를 해결할 수 있지만 unhexlify의 경우 이진 값을 비교하고 비교할 때 더 강력합니다.

사실 출력을 올바르게 복사하고 붙여 넣은 경우, 그 중 하나의 16 진수 문자열에 중간에 공백이 있으므로 실제로 16 진수 쌍을 16 진수 쌍 사이의 선택적 공백으로 unhexlify해야합니다.AFAIK, 거기에이 작업을 수행에는 다음 stdlib 기능입니다,하지만 당신은 한 번에 스스로를 쓸 수있다 : 한편

def unhexlify(s): 
    return binascii.unhexlify(s.replace(' ', '')) 

, 나는 당신이 전혀 difflib.SequenceMatcher를 사용하려는 이유를 모르겠어요. 2 개의 약간 다른 MD5 해시는 완전히 다른 원본 소스를 나타냅니다. MD5와 암호화 해쉬 함수의 전체적인 부분이 일반적입니다. 95 % 일치와 같은 것은 없습니다. 일치 또는 불일치가 있습니다. 당신이 origmd5에서 3 번째로 값이 원하는 것을 알고있는 경우

그래서, 그냥 이렇게 :

s = any(unhexlify(origthingy) == unhexlify(dlmd5) for origthingy in origmd5) 

을 또는 만들기 위해 주위를 회전 :

s = unhexlify(origmd5[2]) == unhexlify(dlmd5) 

을 그렇지 않으면,이 작업을 수행 더 간단합니다 :

s = unhexlify(dlmd5) in map(unhexlify, origthingy) 

또는 무엇이든 가장 가독성이 높은 것을 찾으십시오.

관련 문제