围绕特定实例格式化带有{}的字符串

时间:2017-05-04 16:20:00

标签: python string python-2.7 format

我有一个函数可以创建哈希验证正则表达式:

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方法,可以成功完成吗?

1 个答案:

答案 0 :(得分:0)

您需要使用三个大括号{{{}}}。外部两个大括号在结果中生成文字{},内括号由hex_len替换。

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