首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.format()字符串,如果没有匹配,则保留花括号

.format()字符串,如果没有匹配,则保留花括号
EN

Stack Overflow用户
提问于 2022-02-25 19:19:31
回答 3查看 243关注 0票数 0

我尝试用如下的花括号格式化字符串:

代码语言:javascript
运行
复制
dct_mapper = dict(a=1)
s = '{key1: value2, key1: value2}; attrib1={a}; attrib2={b}'
s.format(**dct_mapper)

Results in:
# KeyError: 'key1'

Expected:
# '{key1: value2, key1: value2}; attrib1=1; attrib2={b}'

另一个限制因素是,我需要在稍后的输出中使用.format_map(),这会使使用.format()的解决方案陷入困境,因为out花括号将消失。

我尝试了集合中的默认值包,也进入了地图(),然后用regex替换括号及附加括号,它感觉不太像解决方案,更像是黑客,而且如果字符串中有多个重复括号,那么它也不能工作。

它不是json字符串,因为这样我就可以使用json库来映射值。

有谁知道怎么解决这个问题吗?

目前,我考虑使用循环和str.replace('{a}', 1),但这也让人感到笨重。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-25 19:36:46

如果您不想将{}转换为{{}},我建议您使用string中的Template。它的接口允许您像下面所做的那样自定义格式选项:

代码语言:javascript
运行
复制
from string import Template


class MyTemplate(Template):
    delimiter = ""


dct_mapper = dict(a=1)
s = MyTemplate('{key1: value2, key1: value2}; attrib1={a}; attrib2={b}')
print(s.safe_substitute(**dct_mapper))

输出是,如您所愿:{key1: value2, key1: value2}; attrib1=1; attrib2={b}

说明:默认情况下,我Template使用$var而不是{var}格式化字符串,因此我将变量名($之后)的模式更改为${var},分隔符本身改为"",所以{var}就足够了,而不是${var}

此外,模板有safe_substitute,它允许您格式化整个字符串中的几个变量,并且它不会对不存在的变量格式产生错误。

此外,如果您喜欢这样做,那么可以将s.safe_substitute(**dct_mapper)更改为s.safe_substitute(dct_mapper)

票数 4
EN

Stack Overflow用户

发布于 2022-02-25 19:50:42

您的格式字符串无效,但假设您希望在这种情况下实际打印大括号。双倍的大括号打印一个文字大括号。

如果键不存在,您可以子类dict返回带括号的格式键。这填补了{a}的空白,但使{b}不受影响:

代码语言:javascript
运行
复制
class MyDict(dict):

    # "magic" method called when a key is missing from the dict
    def __missing__(self, key):
        return f'{{{key}}}'

dct_mapper = MyDict(a=1)
s = '{{key1: value2, key1: value2}}; attrib1={a}; attrib2={b}'
# Must use format_map.  format(**dct_mapper) doesn't work
print(s.format_map(dct_mapper))

输出:

代码语言:javascript
运行
复制
{key1: value2, key1: value2}; attrib1=1; attrib2={b}
票数 2
EN

Stack Overflow用户

发布于 2022-02-25 19:26:48

这就是你要找的吗?

代码语言:javascript
运行
复制
dct_mapper = dict(a=1, b=2)
s = '{{key1: value2, key1: value2; attrib1={a}; attrib2={b}}}'.format(**dct_mapper)

输出:{key1: value2,key1: value2;attrib1=1;attrib2=2}

代码语言:javascript
运行
复制
dct_mapper = dict(a=1, b=1)
s = '{{key1: value2, key1: value2; attrib1={a}; attrib2={b}}}'.format(**dct_mapper)

输出:{key1: value2,key1: value2;attrib1=1;attrib2=1}

但是,如果您只试图传递一个值,比如"a",它将抛出一个错误,因为format()将填充给字符串中所有{}的值。

代码语言:javascript
运行
复制
dct_mapper = dict(a=1)
s = '{{key1: value2, key1: value2; attrib1={a}; attrib2={b}}}'.format(**dct_mapper)

输出: KeyError:'b‘

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71270767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档