繁体   English   中英

在特定实例周围使用{}格式化字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM