python-3.x 在字符串格式中,我一次只能替换一个参数吗?

0md85ypi  于 2023-05-08  发布在  Python
关注(0)|答案(6)|浏览(217)

有没有办法只能在字符串格式中替换第一个参数?就像这样:

"My quest is {test}{}".format(test="test")

我希望输出为:

"My quest is test {}

第二个{} arg稍后将替换。
我知道我可以创建一个字符串如下:

"My quest is {test}".format(test="test")

然后将它与剩余的字符串组合,创建新的字符串,但我可以一次完成吗?

mbzjlibv

mbzjlibv1#

如果你知道当你设置格式字符串时,你只会替换值的一个子集,并且你想保留一些其他的集合,你可以通过将括号加倍来转义那些你不打算立即填充的集合:

x = "foo {test} bar {{other}}".format(test="test") # other won't be filled in here
print(x)                              # prints "foo test bar {other}"
print(x.format(other="whatever"))     # prints "foo test bar whatever"
wgeznvg7

wgeznvg72#

使用命名参数,并保留其他参数,以便用相同的参数替换。
经常使用这个来“规范化字符串”,这样它们就可以预先适应一般的模式:

>>> x = "foo {test} bar {other}"
>>> x = x.format(test='test1', other='{other}') 
>>> x
'foo test1 bar {other}'
>>> x = x.format(other='other1')                
>>> x
'foo test1 bar other1'
jhdbpxl9

jhdbpxl93#

您必须编写自己的格式函数,该函数只进行一次替换。例如,给予你一些开始的东西(注意,这在某种程度上容易受到错误格式字符串的影响):

import re
def formatOne(s, arg):
    return re.sub('\{.*?\}', arg, s, count=1)

用法如下:

>>> s = "My quest is {test}{}"
>>> formatOne(s, 'test')
'My quest is test{}'
>>> formatOne(_, ' later')
'My quest is test later'
nc1teljy

nc1teljy4#

在同一行中替换它的唯一方法是用另一个括号替换"{test}"。即:

s = "My quest is {test}".format(test="test {}").format('testing')

但这没什么意义,因为你本可以这么做

s = "My quest is {test} {}".format('testing', test="test {}")

马上
您可以保留以下结果:

s = "My quest is {test}".format(test="test {}")

所以s里面有一个括号,等待被替换,如果需要的话,以后可以调用format

vkc1a9a2

vkc1a9a25#

实现这一点的正确方法可能是将string.Formatter类子类化,并使用其示例而不是string方法:

from string import Formatter
class IncrementalFormatter(Formatter):
    pass  # your implementation
f = IncrementalFormatter()
f.format("hello {name}", name="Tom")

必须覆盖以下Formatter方法:

  1. get_value()应该返回一些特殊的对象,而不是提升LookupError
  2. get_field()应该将field_name参数保存到这个对象中(或者如果对象不是我们的特殊对象,则正常进行)。
  3. convert_field()应该只将conversion参数保存到这个对象中,并且不进行转换(或者正常进行...)。
  4. format_field()应该使用特殊对象的field_nameconversion属性以及此方法的format_spec参数从特殊对象重构字段格式字符串(或正常进行...)。
    例如:
f.format("{greet} {who.name!r:^16s}", greet="hello")

结果应该是"hello {who.name!r:^16s}",其中"who.name"field_name"r"conversion"^16s"format_spec,所有这三个值都被重新组合回"{who.name!r:^16s}",以便它可以在下一次格式化过程中使用。
附加说明:特殊对象应该在访问任何属性(使用.)或项目(使用[])时返回其自身。

prdp8dxp

prdp8dxp6#

您可以使用python中的replace功能来替换字符串,而不是使用format,这允许您以任何顺序执行此操作,并且一次替换一个字符串

x = "{param1} test {param2}"
x = x.replace("{param1}", param1)
x = x.replace("{param2}", param2)

相关问题