我想出了:
re.findall("([a-fA-F\d]*)", data)
但它不是非常简单的证据,是否有更好的方法来获取所有MD5哈希码?
答案 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"
但是,如果那只是一个足够好的东西,因为你知道在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正好由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个字符怎么样?