Вот лучший способ сделать это, чем некоторые другие решения:
re.findall(r'(?i)(?<![a-z0-9])[a-f0-9]{32}(?![a-z0-9])', data)
Это гарантирует, что совпадение должно быть строкой из 32 шестнадцатеричных цифровых символов, , но которая не содержится в большей строке других буквенно-цифровых символов. Со всеми другими решениями, если есть строка При 37 смежных шестнадцатеричных числах шаблон совпадал бы с первыми 32 и называл его совпадением, или, если в строке 64 шестнадцатеричных числа, он делил бы его пополам и сопоставлял каждую половину как независимое совпадение. Исключение этих данных выполняется с помощью утверждений lookahead и lookbehind, которые не фиксируются и не влияют на содержимое совпадения.
Обратите внимание также на флаг (? I), который делает регистр нечувствительным к регистру, что экономит немного времени при наборе текста, а завершение всего шаблона в скобках является излишним.