当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《用于MD5哈希的Python正则表达式》经验,为你挑选了4个好方法。

我想出来:

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

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



1> Marc Novakow..:

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

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


[维基百科](https://en.wikipedia.org/wiki/Hexadecimal#Using_0.E2.80.939_and_A.E2.80.93F)说:*没有通用约定使用小写或大写字母数字,每个在社区标准或惯例的特定环境中是普遍的或优先的.*您应该涵盖所有安全方面的案例.
MD5不是全部小写吗?这会更好`[0-9a-f] {32}`

2> Greg Hewgill..:

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

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

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

有关更多信息,请参阅re模块文档.



3> ʞɔıu..:

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

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

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

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有