我想出来:
re.findall("([a-fA-F\d]*)", data)
Run Code Online (Sandbox Code Playgroud)
但它不是非常简单的证据,是否有更好的方法来获取所有MD5哈希码?
Mar*_*ski 52
好吧,因为md5只是一个32位十六进制数字的字符串,所以你可以添加到你的表达式中的是检查"32位数",也许是这样的?
re.findall(r"([a-fA-F\d]{32})", data)
Run Code Online (Sandbox Code Playgroud)
Gre*_*ill 12
在Python中使用正则表达式时,您几乎应该始终使用原始字符串语法r"...":
re.findall(r"([a-fA-F\d]{32})", data)
Run Code Online (Sandbox Code Playgroud)
这将确保字符串中的反斜杠不会被正常的Python转义解释,而是传递给re.findall函数,以便它可以\d逐字查看.在这种情况下,你很幸运,\d不是由Python转义解释,而是类似\b(在Python转义和正则表达式中具有完全不同的含义).
有关更多信息,请参阅re模块文档.
这是比其他一些解决方案更好的方法:
re.findall(r'(?i)(?<![a-z0-9])[a-f0-9]{32}(?![a-z0-9])', data)
Run Code Online (Sandbox Code Playgroud)
这可确保匹配必须是32个十六进制数字字符的字符串,但不包含在更大的其他字母数字字符串中.对于所有其他解决方案,如果存在37个连续十六进制的字符串,则该模式将与前32个匹配并将其称为匹配,或者如果存在64个十六进制的字符串,则将其分成两半并将每一半匹配为独立的比赛.排除这些是通过前瞻和后瞻断言来完成的,这些断言是非捕获的,不会影响匹配的内容.
还要注意(?i)标志,这将使模式不区分大小写,从而节省了一点点打字,并且将整个模式包装在括号中是多余的.
这是一个相当迂腐的表达:
r"\b([a-f\d]{32}|[A-F\d]{32})\b"
Run Code Online (Sandbox Code Playgroud)
但是,如果那只是一个足够好的fr'yer,因为你知道只有一个3402823获得全数字MD5校验和的机会,以及42万亿到一个全字母数字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
Run Code Online (Sandbox Code Playgroud)
是的,我在工作中非常无聊.