使用带有 ^ 和 $ 字符串分隔符的正则表达式匹配 MD5 哈希



>我有一个从文本中抓取MD5哈希的函数。我想将匹配限制为仅由a-zA-Z0-9组成的 32 个字符,MD5 哈希值。在某些搜索中,如果有一个 32 个字符的匹配项,并且在字符串的末尾也有.exe,那么它也匹配该匹配项,这是不需要的。我想消除任何包含超过 32 个字符的匹配项。

我正在测试的"数据"是:

7bf2b57f2a205768755c07f238fb32cc
84c82835a5d21bbcf75a61706d8ab549
95673b0f968c0f55b32204361940d184
95673b0f968c0f55b32204361940d184.exe

这是当前代码:

import re
def md5():
data = self.text_input.get('1.0', 'end')
s = re.compile(r'[A-Fa-f0-9]{32}')
md5_list = s.findall(data)

生产:

7bf2b57f2a205768755c07f238fb32cc
84c82835a5d21bbcf75a61706d8ab549
95673b0f968c0f55b32204361940d184
95673b0f968c0f55b32204361940d184.exe (This match is not wanted)

但是,当我为字符串的开头和结尾添加^$时,它不起作用。数据输入与上述完全相同。没有错误,它只是不产生任何匹配项,这些匹配项由上面的代码确认。

import re
def md5():
data = self.text_input.get('1.0', 'end')
s = re.compile(r'^[A-Fa-f0-9]{32}$')
md5_list = s.findall(data)

产生:未产生输出,无错误代码,无异常。如果没有.exe,我怎么能完全匹配我想要的东西?

此函数位于 TKinter 应用程序中,如果这有任何区别。

如果您希望从行的开头或行中的任何位置进行匹配,并且必须在第 32 个字符之后有一个空格,则可以使用:

(?<!S)[A-Fa-f0-9]{32}(?= )
  • (?<!S)负面回头,断言左侧的内容不是非空格字符
  • [A-Fa-f0-9]{32}匹配32次列出的任何
  • (?= )积极的展望,断言右边是一个空间

注意如果要断言空格字符而不是空格,可以使用(?=s)

正则表达式演示

我认为解决方案就像在对re.compile的调用中添加flags=re.M一样简单,以便^$锚点匹配行的开头和结尾以及字符串的开头和结尾:

import re
data = """7bf2b57f2a205768755c07f238fb32cc
84c82835a5d21bbcf75a61706d8ab549
95673b0f968c0f55b32204361940d184
95673b0f968c0f55b32204361940d184.exe"""
regex = re.compile(r'^[A-Fa-f0-9]{32}$', flags=re.M)
md5_list = regex.findall(data)
print(md5_list)

指纹:

['7bf2b57f2a205768755c07f238fb32cc', '84c82835a5d21bbcf75a61706d8ab549', '95673b0f968c0f55b32204361940d184']

所有评论都有帮助,谢谢!经过更多的研究,我还发现了基于我不知道的数据源的其他要求和要求,......它发生了。我需要在混合文本中找到 MD5 哈希,只提取不包含文件扩展名的样本,然后消除文本中出现的任何重复项。输入很复杂,示例是此公共恶意软件配置文件

(https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html(。

复制此页面中的所有文本并将其转储到下面的"data"变量中,这就是您的开始。如前所述,正则表达式需要自定义的特定边界。

我的解决方案是在正则表达式的开头使用"\b"字边界,并在末尾指定一个空格"\s",从而消除超过 32 个字符的匹配项。此外,我还发现了混合大小写问题,因此我将每个匹配的条目更改为大写,然后将它们添加到集合中。集合不允许重复,因此消除了出现的任何重复。我现在得到了一个干净的 MD5 哈希值列表,每次运行它时都会正确检查出来。这很容易扩展到 SHA1 和 SHA256 值。

def md5():
data = self.text_input.get('1.0', 'end')
s = re.compile(r'b[a-fA-Z0-9]{32}s')
md5 = s.findall(data.upper())
md5_set = set(md5)
for hash in md5_set:
self.text_out.insert('end', hash + 'n')

最新更新