2017-05-04 55 views
0

我將創建哈希驗證的正則表達式的功能:格式化一個字符串{}圍繞一個特定的實例

import re 

def build_re(hex_len, prefix=r"", suffix=r"(:.+)?"): 
    regex_string = r"^{}[a-f0-9]{}{}$".format(prefix, hex_len, suffix) 
    return re.compile(regex_string, re.IGNORECASE) 

此功能應採取的哈希(098f6bcd4621d373cade4e832627b4f6爲例)的長度並驗證它然而,當我使用這個功能:

md5 = build_re(32) 
print md5.match("098f6bcd4621d373cade4e832627b4f6") 
>>> None 
len("098f6bcd4621d373cade4e832627b4f6") 
>>> 32 

它確實應該匹配32個字符的字符串哈希,如果我做手工:

>>> hash_regex = "^[a-f0-9]{32}(:.+)?$" 
>>> test_string = "098f6bcd4621d373cade4e832627b4f6" 
>>> data = re.compile(hash_regex) 
>>> data.match(test_string) 
<_sre.SRE_Match object at 0x02ABB4E0> 
>>> if data.match(test_string): 
    print "matched"  
matched 

所以我想也許這是導致它的前綴:

>>> def build_re(hex_len, prefix=r"", suffix=r"(:.+)?"): 
     regex_string = r"^{}[a-f0-9]{}{}$".format(prefix, hex_len, suffix) 
     print regex_string 
     return re.compile(regex_string, re.IGNORECASE) 

>>> build_re(32) 
^[a-f0-9]32(:.+)?$ 
<_sre.SRE_Pattern object at 0x029D89E0> 
>>> 

這並不能證明什麼,然後我注意到:"^[a-f0-9]32(:.+)?$" == "^[a-f0-9]{32}(:.+)?$"False因爲在功能構建正則表達式的32沒有{}各地它。所以我的問題是,我如何使用.format函數格式化字符串,並在該字符串的特定實例周圍提供大括號?如果我不嘗試,我得到:

>>> def build_re(hex_len, prefix=r"", suffix=r"(:.+)?"): 
     regex_string = r"^{}[a-f0-9]{{}}{}$".format(prefix, hex_len, suffix) 
     print regex_string 
     return re.compile(regex_string, re.IGNORECASE) 

>>> build_re(32) 
^[a-f0-9]{}32$ 
<_sre.SRE_Pattern object at 0x02A40740> 
>>> 

可以這樣做成功,而無需使用deprecared %d方法呢?

+0

請刪除所有與您的問題無關的信息,並將其縮短爲*「如何在包含大括號的字符串中使用'.format'?」*。 –

+0

@Rawing我只是展示了我如何得出結論 – oaq25955

+0

你有一個簡單的問題;爲什麼誇大它到這個怪異的文本牆?你如何得出結論完全無關緊要。它不會幫助我們解決您的問題,它只會迫使我們閱讀更多內容,並讓您的問題更加容易理解。 –

回答

0

您需要使用三個大括號{{{}}}。結果中外部的兩個大括號產生文字{},並且內部大括號被hex_len取代。

regex_string = r"^{}[a-f0-9]{{{}}}{}$".format(prefix, hex_len, suffix) 
相關問題