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