2017-03-09 4 views
2

Ich versuche, einen regulären Ausdruck zu schreiben, die zur Zeit einen Hash bekommen werden ich die folgende regex habe, die MD5 fängt HashesPython regulärer Ausdruck für genaue Stringlänge

[0-9a-fA-F].{32} 

Dies wird jedoch auch die ersten 32 Zeichen erhalten von eine längere Zeichenfolge wie ein SHA-1-Hash. Ich frage mich, wie ich das bearbeiten kann, um sicherzustellen, dass es nur übereinstimmt, wenn die Zeichenfolge 32 Zeichen lang ist und nicht 40 Zeichen?

EDIT: Sorry, ich sollte ich Python bin mit

2.7 gesagt haben
+3

Verwenden Anker ('^ [0-9a-fA-F] {32} $') oder 're.fullmatch' –

+3

Warum Sie dot hier verwenden? – Dmitry

+0

@Dmitry genau: das würde 33 Zeichen im aktuellen Zustand entsprechen (Sebastian hat seinen Kommentar aktualisiert :)) –

Antwort

3

MD5-Hash passen, wie eine ganze Reihe Start/Ende des $^, Anker Zeichenfolge verwenden:

s = "3b4e1a15682994ef0bb2cbea8abfa105" 
result = re.search(r'^[0-9a-fA-F]{32}$', s) 

print result.group() # 3b4e1a15682994ef0bb2cbea8abfa105 

Um MD5-Hash als Teilzeichenfolge (Teil des Textes) zu entsprechen, verwenden Sie Wortgrenzen \b:

s = "hash 3b4e1a15682994ef0bb2cbea8abfa105 some text" 
result = re.search(r'\b[0-9a-fA-F]{32}\b', s) 

print result.group() # 3b4e1a15682994ef0bb2cbea8abfa105 
+0

@ user7399815, das ist wirklich seltsames Verhalten, aber es würde 128 Bit-Hash mit 're.search (r '\ b [0-9a-fA-F] {127} \ b ', s) ' – RomanPerekhrest

1

Es gibt einen kleinen (aber alle wichtigen) Fehler in Ihrer Regex - [0-9a-fA-F].{32} entspricht einem Hex-Zeichen und dann 32 von beliebigen Zeichen (außer Newline). Ihr Muster sollte so sein [0-9a-fA-F]{32}

Um zu überprüfen, dass die gesamte Zeichenfolge abgestimmt ist, können Sie entweder re.fullmatch (added in Python 3.4) oder verwenden Sie Anker ^ (Anfang des Strings) und $ (Ende des Strings)

+0

Danke Mann, mit Ankern funktioniert! – user7399815

0

Sie verwenden können, Einfügen einiger Beispielstrings (jeweils von Länge 32 und 40)?

Ohne das Beispiel kann ich daran denken, ^ und $ zu verwenden, um den Anfang der Zeichenfolge und das Ende der Zeichenfolge wie in der Python re tutorial erläutert.

Beispiel:

^[0-9a-fA-F]{32}$ 
+0

Hier sind einige Beispiele für Hashes Länge 32 (MD5) und 40 (SHA-1). 9c3aec2376f1052a95d8de480a37572f, 566dd7d858598375eaa7f468379447c673d934e2 – user7399815