Подтвердить что ты не робот

Регулярное выражение Python для хеша MD5

Я придумал:

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Дополнительную информацию см. в документации по re.

Ответ 3

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

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

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

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

Ответ 4

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"

Ответ 5

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

Ответ 6

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

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

Но если это просто 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

да, мне было ужасно скучно на работе.