比较python中的两个字符串

时间:2013-03-14 18:19:29

标签: python string compare difflib

我需要比较两个字符串,或者至少找到一个字符串到另一个字符串的字符序列。这两个字符串包含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是['0430f244a18146a0815aa1dd4012db46','0430f244a18146a0815aa1dd40 12db46','59739CCDA2F15D5AC16DB6695CAE3378']

下载程序文件md5是59739ccda2f15d5ac16db6695cae3378

比率为:0.0

因此!在origmd5中有一个来自dlmd5的匹配但不知何故找不到它...... 我在某处做错了...请帮帮我:/

3 个答案:

答案 0 :(得分:0)

基本上,你需要idom if test_string in list_of_strings。看起来您不需要区分大小写,因此您可能需要

if test_string.lower() in (s.lower() for s 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!

答案 1 :(得分:0)

看起来你遇到了问题,因为案件与字母不匹配。可能想试试:

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()

答案 2 :(得分:0)

鉴于输入:

  

原版md5是['0430f244a18146a0815aa1dd4012db46','0430f244a18146a0815aa1dd40 12db46','59739CCDA2F15D5AC16DB6695CAE3378']

     

下载程序文件md5是59739ccda2f15d5ac16db6695cae3378

你有两个问题。

首先,第一个不仅仅是MD5,而是MD5和其他两个东西。

要解决此问题:如果您知道origmd5始终采用此格式,请使用origmd5[2]代替origmd5。如果您不知道origmd5是什么,除了其中的一个是实际的MD5之外,您将不得不与所有元素进行比较。

其次,实际的MD5值都是表示相同二进制数据的十六进制字符串,但它们是不同的十六进制字符串(因为一个是大写字母,另一个是小写字母)。您可以通过仅进行不区分大小写的比较来解决此问题,但它们可能对unhexlify两者都更加健壮,并比较二进制值。

实际上,如果您正确地复制并粘贴了输出,那么这些十六进制字符串中至少有一个在其中间有一个空格,因此您实际上需要在十六进制对之间使用可选空格取消六角形字符串。 AFAIK,没有stdlib函数可以执行此操作,但您可以自己编写一步:

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

与此同时,我不确定你为什么要尝试使用difflib.SequenceMatcher。两个略有不同的MD5哈希指的是完全不同的原始来源;这就是MD5的重点,以及一般的加密哈希函数。没有95%匹配的东西;无论是匹配还是不匹配。

所以,如果您知道origmd5中的第3个值是您想要的值,那么就这样做:

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

否则,请执行以下操作:

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

或者,转过身来使其变得更简单:

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

或者你认为最易读的等同物。