[英]Formatting a string with {} around a specific instance
我有一个将创建哈希验证正则表达式的函数:
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
方法,是否可以成功完成此操作?
您需要使用三个大括号{{{}}}
。 外部的两个大括号在结果中产生文字{}
,而内部的大括号被hex_len
替换。
regex_string = r"^{}[a-f0-9]{{{}}}{}$".format(prefix, hex_len, suffix)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.