我有一个函数可以创建哈希验证正则表达式:
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>
>>>
如果不使用已弃用的%d
方法,可以成功完成吗?
答案 0 :(得分:0)
您需要使用三个大括号{{{}}}
。外部两个大括号在结果中生成文字{}
,内括号由hex_len
替换。
regex_string = r"^{}[a-f0-9]{{{}}}{}$".format(prefix, hex_len, suffix)