2017-03-09 113 views
2

我想寫一個正則表達式,將得到一個哈希目前我有以下的正則表達式來捕獲MD5散列Python正則表達式的確切字符串長度

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

然而,這也將得到的前32個字符一個更長的字符串,如SHA-1哈希。我想知道如何編輯這個以確保它只匹配字符串長度爲32個字符而不是40個字符?

編輯:對不起,我應該說我使用Python 2.7

+3

使用錨('^ [0-9A-FA-F] {32} $'),或者你爲什麼在這裏點用're.fullmatch' –

+3

? – Dmitry

+0

@Dmitry完全相同:在當前狀態下匹配33個字符(Sebastian已更新他的評論:)) –

回答

3

要匹配MD5散列整個字符串使用開始/結束的字符串^$

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

print result.group() # 3b4e1a15682994ef0bb2cbea8abfa105 

要匹配md5哈希作爲子字符串(部分文本)使用字邊界\b

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

print result.group() # 3b4e1a15682994ef0bb2cbea8abfa105 
+0

@ user7399815,這真是奇怪的行爲,但它會匹配128位哈希與're.search(r'\ b [0-9a-fA-F] {127} \ b',s)' – RomanPerekhrest

1

在你的正則表達式中有一點(但是重要的)錯誤 - [0-9a-fA-F].{32}匹配一個十六進制字符,然後匹配32個任意字符(除了換行符)。因此,你的模式應該是[0-9a-fA-F]{32}

要檢查整個字符串匹配您可以使用re.fullmatchadded in Python 3.4),或使用錨^(字符串的開始)和$(字符串的結束)

+0

謝謝你,使用錨正在工作! – user7399815

0

你能粘貼一些示例字符串(每個長度爲32和40)?

沒有這個例子,我可以想到利用^$匹配字符串的開頭和字符串的結尾,如Python re tutorial中所述。

例子:

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

以下是散列長度爲32(MD5)&40(SHA-1)的一些示例。 9c3aec2376f1052a95d8de480a37572f, 566dd7d858598375eaa7f468379447c673d934e2 – user7399815