Регулярное выражение Python для хэша MD5 - PullRequest
19 голосов
/ 17 декабря 2008

Я придумал:

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

но это не очень надежно, есть ли лучший способ получить все хэш-коды MD5?

Ответы [ 6 ]

51 голосов
/ 17 декабря 2008

Ну, так как md5 - это просто строка из 32 шестнадцатеричных цифр, все, что вы можете добавить к своему выражению, это проверка на "32 цифры", возможно, что-то вроде этого?

re.findall(r"([a-fA-F\d]{32})", data)
12 голосов
/ 17 декабря 2008

При использовании регулярных выражений в Python, вы почти всегда должны использовать синтаксис необработанной строки r"...":

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

Это гарантирует, что обратный слеш в строке не будет интерпретирован обычным экранированием Python, а вместо этого будет передан в функцию re.findall, чтобы он мог видеть дословно \d. В этом случае вам повезло, что \d не интерпретируется экранированием Python, но что-то вроде \b (что имеет совершенно разные значения в экранировании Python и в регулярных выражениях).

Подробнее см. Документацию к модулю re .

8 голосов
/ 18 декабря 2008

Вот лучший способ сделать это, чем некоторые другие решения:

re.findall(r'(?i)(?<![a-z0-9])[a-f0-9]{32}(?![a-z0-9])', data)

Это гарантирует, что совпадение должно быть строкой из 32 шестнадцатеричных цифровых символов, , но которая не содержится в большей строке других буквенно-цифровых символов. Со всеми другими решениями, если есть строка При 37 смежных шестнадцатеричных числах шаблон совпадал бы с первыми 32 и называл его совпадением, или, если в строке 64 шестнадцатеричных числа, он делил бы его пополам и сопоставлял каждую половину как независимое совпадение. Исключение этих данных выполняется с помощью утверждений lookahead и lookbehind, которые не фиксируются и не влияют на содержимое совпадения.

Обратите внимание также на флаг (? I), который делает регистр нечувствительным к регистру, что экономит немного времени при наборе текста, а завершение всего шаблона в скобках является излишним.

5 голосов
/ 10 августа 2014

Вот довольно педантичное выражение:

r"\b([a-f\d]{32}|[A-F\d]{32})\b"
  • строка должна быть ровно 32 символа,
  • строка должна быть между границей слова (новая строка, пробел и т. Д.),
  • альфа должна быть в нижнем регистре a-f ИЛИ все в верхнем регистре A-F, но не смешанные.

Но если это достаточно хороший фрейер, потому что вы знаете, что у 3402823 есть только 1 шанс получить полностью числовую контрольную сумму 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

Да, мне ужасно скучно на работе.

3 голосов
/ 09 марта 2013

MD5 Python Regex с примерами

Поскольку MD5 состоит ровно из 32 шестнадцатеричных символов, а иногда хэш представлен строчными буквами, их также следует учитывать.


Приведенный ниже пример был протестирован на четырех разных строках:

  • Действительный хеш MD5 в нижнем регистре
  • Действительный хэш MD5 в верхнем регистре
  • Строка из 64 шестнадцатеричных символов (чтобы не допустить разделения и совпадения)
  • Строка из 37 шестнадцатеричных символов (чтобы гарантировать, что 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"

2 голосов
/ 17 декабря 2008

Как насчет "([a-fA-F \ d] {32})", который требует, чтобы он был длиной 32 символа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...