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

时间:2016-11-18 07:31:55

标签: python python-3.x string-formatting

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

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

我希望输出为:

"My quest is test {}

我将稍后替换第二个{} arg。

我知道我可以创建一个字符串,如:

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

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

4 个答案:

答案 0 :(得分:8)

如果您知道何时设置格式字符串,而您只是替换值的子集,并且您希望保留其他一些集合,那么您可以逃避那些您不会去的那些通过加倍括号立即填写:

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"

答案 1 :(得分:1)

您可以在同一行中替换它的唯一方法是将"{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

答案 2 :(得分:1)

您必须编写自己的格式化功能,只能进行一次替换。例如,为了给你一些开始(注意这有点容易受到错误的格式字符串的影响):

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'

答案 3 :(得分:-1)

实现此目的的正确方法可能是子类string.Formatter类并使用其实例而不是字符串方法:

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参数从特殊对象重建字段格式字符串(或正常进行...)。
  5. 所以,例如:

    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}",以便可以在下一个格式化过程中使用。

    附加说明:特殊对象应在访问任何属性(使用.)或项目(使用[])时自行返回。