用于MD5哈希的Python正则表达式

时间:2008-12-16 23:45:03

标签: python regex md5

我想出了:

re.findall("([a-fA-F\d]*)", data)

但它不是非常简单的证据,是否有更好的方法来获取所有MD5哈希码?

6 个答案:

答案 0 :(得分:51)

好吧,因为md5只是一个32位十六进制数字的字符串,所以你可以添加到你的表达式中的是检查“32位数”,也许是这样的?

re.findall(r"([a-fA-F\d]{32})", data)

答案 1 :(得分:12)

在Python中使用正则表达式时,您几乎应该始终使用原始字符串语法r"..."

re.findall(r"([a-fA-F\d]{32})", data)

这将确保字符串中的反斜杠不会被正常的Python转义解释,而是传递给re.findall函数,以便它可以逐字地看到\d。在这种情况下,幸运的是,\d不会被Python转义解释,但类似\b(在Python转义和正则表达式中具有完全不同的含义)将是。

有关详细信息,请参阅re module documentation

答案 2 :(得分:8)

这是一种比其他一些解决方案更好的方法:

re.findall(r'(?i)(?<![a-z0-9])[a-f0-9]{32}(?![a-z0-9])', data)

这确保匹配必须是32个十六进制数字字符的字符串,但不包含在更大的其他字母数字字符串中。使用所有其他解决方案,如果有字符串在37个连续的十六进制中,模式将与前32个匹配并将其称为匹配,或者如果存在64个十六进制的字符串,则将其分成两半并将每一半匹配为独立匹配。排除这些是通过前瞻和后瞻断言完成的,这些断言是非捕获的,不会影响匹配的内容。

还要注意(?i)标志,它会使模式不区分大小写,从而节省了一点点打字,并且将整个模式包装在括号中是多余的。

答案 3 :(得分:5)

这是一个相当迂腐的表达:

r"\b([a-f\d]{32}|[A-F\d]{32})\b"
  • string必须正好是32个字符,
  • 字符串必须位于单词边界(换行符,空格等)
  • 之间
  • alpha必须全部为小写a-f OR 全部为大写字母A-F,但不能混合。

但是,如果那只是一个足够好的东西,因为你知道在3402823中只有一个获得全数字MD5校验和的机会,以及42万亿到一个全部机会-alphanumeric MD5校验和,那么你知道我们应该对那些有效的总和说FU,也不接受任何不是字母数字的东西:

r"\b(?!^[\d]*$)(?!^[a-fA-F]*$)([a-f\d]{32}|[A-F\d]{32})\b"

00000000000000000000000000000000 # not MD5
01110101001110011101011010101001 # not MD5
ffffffffffffffffffffffffffffffff # not MD5
A32efC32c79823a2123AA8cbDDd3231c # not MD5
affa687a87f8abe90d9b9eba09bdbacb # is MD5
C787AFE9D9E86A6A6C78ACE99CA778EE # is MD5
please like and subscribe to my  # not MD5

是的,我在工作中非常无聊。

答案 4 :(得分:3)

MD5 Python Regex With Examples

由于MD5正好由32个十六进制字符组成,有时哈希是使用小写字母表示的,因此也应该考虑它们。


以下示例针对四种不同的字符串进行了测试:

  • 有效的低级MD5哈希
  • 有效的大写MD5哈希
  • 64个十六进制字符的字符串(以确保不会发生拆分和匹配)
  • 37个十六进制字符的字符串(以确保前32个字符不匹配)
  

900e3f2dd4efc9892793222d7a1cee4a

     

AC905DD4AB2038E5F7EABEAE792AC41B

     

900e3f2dd4efc9892793222d7a1cee4a900e3f2dd4efc9892793222d7a1cee4a

     

900e3f2dd4efc9892793222d7a1cee4a4a4a4


    validHash = re.finditer(r'(?=(\b[A-Fa-f0-9]{32}\b))', datahere)

    result = [match.group(1) for match in validHash]

    if result: 

        print "Valid MD5"

    else:

        print "NOT a Valid MD5"

答案 5 :(得分:2)

“([a-fA-F \ d] {32})”要求它长32个字符怎么样?