Я придумал:
re.findall("([a-fA-F\d]*)", data)
но это не очень надежное доказательство, есть ли лучший способ захватить все MD5-хэш-коды?
Я придумал:
re.findall("([a-fA-F\d]*)", data)
но это не очень надежное доказательство, есть ли лучший способ захватить все MD5-хэш-коды?
Ну, так как md5 - это всего лишь строка из 32 шестнадцатеричных цифр, все, что вы могли бы добавить в ваше выражение, это проверка на "32 цифры", возможно, что-то вроде этого?
re.findall(r"([a-fA-F\d]{32})", data)
При использовании регулярных выражений в Python вы почти всегда должны использовать синтаксис raw string r"..."
:
re.findall(r"([a-fA-F\d]{32})", data)
Это гарантирует, что обратная косая черта в строке не интерпретируется обычным экранированием Python, но вместо этого передается функции re.findall
, поэтому она может видеть стенографию \d
. В этом случае вам повезло, что \d
не интерпретируется с помощью экранирования Python, но что-то вроде \b
(которое имеет совершенно разные значения в экранировании Python и в регулярных выражениях).
Дополнительную информацию см. в документации по re
.
Вот лучший способ сделать это, чем некоторые другие решения:
re.findall(r'(?i)(?<![a-z0-9])[a-f0-9]{32}(?![a-z0-9])', data)
Это гарантирует, что совпадение должно быть строкой из 32 шестнадцатеричных цифр, но не содержится в большей строке других буквенно-цифровых символов. Со всеми другими решениями, если есть строка из 37 смежных гексадецималов, шаблон будет соответствовать первым 32 и называть его совпадением, или если есть строка из 64 гексадецимал, она будет разделять ее пополам и сопоставлять каждую половину как независимую совпадение. Исключение выполняется с помощью утверждений lookahead и lookbehind, которые не захватываются и не влияют на содержимое совпадения.
Обратите внимание также, что флаг (? i) делает шаблон нечувствительным к регистру, который сохраняет немного ввода текста, и что обертывание всего шаблона в круглых скобках является излишним.
Поскольку MD5 состоит из ровно 32 шестнадцатеричных символов, а иногда хэш представлен с помощью строчных букв, следует также учитывать их.
Нижеприведенный пример был протестирован против четырех разных строк:
900e3f2dd4efc9892793222d7a1cee4a
AC905DD4AB2038E5F7EABEAE792AC41B
900e3f2dd4efc9892793222d7a1cee4a900e3f2dd4efc9892793222d7a1cee4a
900e3f2dd4efc9892793222d7a1cee4a4a4a4
validHash = re.finditer(r'(?=(\b[A-Fa-f0-9]{32}\b))', datahere)
result = [match.group(1) for match in validHash]
if result:
print "Valid MD5"
else:
print "NOT a Valid MD5"
Как насчет "([a-fA-F\d] {32})", для которого требуется 32 символа?
Здесь довольно педантичное выражение:
r"\b([a-f\d]{32}|[A-F\d]{32})\b"
Но если это просто a'int достаточно хорошо fr'yer, потому что вы знаете, что есть только 1 в 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
да, мне было ужасно скучно на работе.