22

私が思いついた:

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

すべての MD5 ハッシュ コードを取得するより良い方法はありますか?

4

6 に答える 6

60

md5 は 32 桁の 16 進数の文字列なので、式に追加できるのは「32 桁」のチェックだけです。

re.findall(r"([a-fA-F\d]{32})", data)
于 2008-12-16T23:51:02.607 に答える
12

Python で正規表現を使用する場合、ほとんどの場合、生の文字列構文を使用する必要がありますr"..."

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

これにより、文字列内のバックスラッシュが通常の Python エスケープによって解釈されず、代わりにre.findall関数に渡されるため、\d逐語的に表示されます。この場合\d、Python エスケープによって解釈されないのは幸運ですが、 \b(Python エスケープと正規表現ではまったく異なる意味を持ちます) のようなものです。

詳細については、reモジュールのドキュメントを参照してください。

于 2008-12-17T00:31:29.873 に答える
9

他のソリューションよりも優れた方法を次に示します。

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

これにより、一致は 32 桁の 16 進数文字の文字列である必要がありますが、他の英数字のより大きな文字列には含まれません。他のすべてのソリューションでは、37 個の連続した 16 進数の文字列がある場合、パターンは最初の 32 個と一致し、それを一致と呼びます。または、64 個の 16 進数の文字列がある場合、それを半分に分割し、それぞれの半分を独立したものとして一致させます。マッチ。これらの除外は、先読みおよび後読みアサーションによって実現されます。これらは非キャプチャであり、一致の内容には影響しません。

パターンの大文字と小文字を区別しないようにする (?i) フラグにも注意してください。

于 2008-12-18T04:13:35.620 に答える
5

これはかなり衒学的な表現です:

r"\b([a-f\d]{32}|[A-F\d]{32})\b"
  • string は正確に 32 文字の長さでなければなりません。
  • 文字列は単語境界 (改行、スペースなど) の間にある必要があります。
  • alpha はすべて小文字の afまたはすべて大文字の af である必要がありますが、混在させることはできません。

しかし、それだけで十分ではない場合は、すべて数値の MD5 チェックサムが得られる可能性は 3402823 分の 1 であり、すべてが英数字の MD5 チェックサムが得られる可能性は 42 兆分の 1 であることがわかっているため、おそらく、これらの有効な合計に対して 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

はい、私は仕事でひどく退屈しています。

于 2014-08-10T18:52:35.877 に答える
3

MD5 Python 正規表現と例

MD5 は正確に 32 個の 16 進文字で構成され、ハッシュは小文字を使用して表示される場合があるため、それらも考慮する必要があります。


以下の例は、4 つの異なる文字列に対してテストされました。

  • 有効な小文字の MD5 ハッシュ
  • 有効な大文字の MD5 ハッシュ
  • 64 個の 16 進文字の文字列 (分割と一致が発生しないようにするため)
  • 37 文字の 16 進文字の文字列 (先頭の 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"

于 2013-03-08T21:46:02.433 に答える
2

32 文字の長さを必要とする "([a-fA-F\d]{32})" はどうですか?

于 2008-12-16T23:51:00.127 に答える