私が思いついた:
re.findall("([a-fA-F\d]*)", data)
すべての MD5 ハッシュ コードを取得するより良い方法はありますか?
md5 は 32 桁の 16 進数の文字列なので、式に追加できるのは「32 桁」のチェックだけです。
re.findall(r"([a-fA-F\d]{32})", data)
Python で正規表現を使用する場合、ほとんどの場合、生の文字列構文を使用する必要があります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 桁の 16 進数文字の文字列である必要がありますが、他の英数字のより大きな文字列には含まれません。他のすべてのソリューションでは、37 個の連続した 16 進数の文字列がある場合、パターンは最初の 32 個と一致し、それを一致と呼びます。または、64 個の 16 進数の文字列がある場合、それを半分に分割し、それぞれの半分を独立したものとして一致させます。マッチ。これらの除外は、先読みおよび後読みアサーションによって実現されます。これらは非キャプチャであり、一致の内容には影響しません。
パターンの大文字と小文字を区別しないようにする (?i) フラグにも注意してください。
これはかなり衒学的な表現です:
r"\b([a-f\d]{32}|[A-F\d]{32})\b"
しかし、それだけで十分ではない場合は、すべて数値の 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
はい、私は仕事でひどく退屈しています。
MD5 は正確に 32 個の 16 進文字で構成され、ハッシュは小文字を使用して表示される場合があるため、それらも考慮する必要があります。
以下の例は、4 つの異なる文字列に対してテストされました。
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"
32 文字の長さを必要とする "([a-fA-F\d]{32})" はどうですか?