在字符串格式中,我一次只能替换一个参数吗?
In string formatting can I replace only one argument at a time?
有什么方法可以只替换字符串格式中的第一个参数吗?像这样:
"My quest is {test}{}".format(test="test")
我希望输出为:
"My quest is test {}
第二个{}
arg我稍后会替换。
我知道我可以创建如下字符串:
"My quest is {test}".format(test="test")
然后将它与剩余的字符串组合并创建新的字符串,但我可以一次性完成吗?
在同一行中替换它的唯一方法是将 "{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
。
您将不得不编写自己的格式函数,只进行一次替换。例如,给你一些开始的东西(注意这有点容易受到错误格式字符串的影响):
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'
如果您知道在设置格式字符串时您只会替换值的一个子集,并且您希望保留其他一些设置,则可以转义那些您不打算正确填充的值将括号加倍:
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"
实现这个的正确方法可能是 subclass string.Formatter class 并使用它的实例而不是字符串方法:
from string import Formatter
class IncrementalFormatter(Formatter):
pass # your implementation
f = IncrementalFormatter()
f.format("hello {name}", name="Tom")
必须覆盖以下 Formatter
方法:
get_value()
应该 return 一些特殊对象而不是引发 LookupError
.
get_field()
应该将 field_name
参数保存到这个对象中(或者如果对象不是我们的特殊对象,则正常进行)。
convert_field()
应该只将 conversion
参数保存到该对象中并且不进行转换(或正常进行...)。
format_field()
应使用其 field_name
和 conversion
属性以及此方法的 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}"
,以便在下一次格式化过程中使用。
补充说明:在访问任何属性(.
)或项目([]
)时,特殊对象应该return本身。
使用命名参数并将其他参数替换为相同参数。
经常使用它来“规范化字符串”,使它们预先符合一般模式:
>>> 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'
有什么方法可以只替换字符串格式中的第一个参数吗?像这样:
"My quest is {test}{}".format(test="test")
我希望输出为:
"My quest is test {}
第二个{}
arg我稍后会替换。
我知道我可以创建如下字符串:
"My quest is {test}".format(test="test")
然后将它与剩余的字符串组合并创建新的字符串,但我可以一次性完成吗?
在同一行中替换它的唯一方法是将 "{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
。
您将不得不编写自己的格式函数,只进行一次替换。例如,给你一些开始的东西(注意这有点容易受到错误格式字符串的影响):
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'
如果您知道在设置格式字符串时您只会替换值的一个子集,并且您希望保留其他一些设置,则可以转义那些您不打算正确填充的值将括号加倍:
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"
实现这个的正确方法可能是 subclass string.Formatter class 并使用它的实例而不是字符串方法:
from string import Formatter
class IncrementalFormatter(Formatter):
pass # your implementation
f = IncrementalFormatter()
f.format("hello {name}", name="Tom")
必须覆盖以下 Formatter
方法:
get_value()
应该 return 一些特殊对象而不是引发LookupError
.get_field()
应该将field_name
参数保存到这个对象中(或者如果对象不是我们的特殊对象,则正常进行)。convert_field()
应该只将conversion
参数保存到该对象中并且不进行转换(或正常进行...)。format_field()
应使用其field_name
和conversion
属性以及此方法的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}"
,以便在下一次格式化过程中使用。
补充说明:在访问任何属性(.
)或项目([]
)时,特殊对象应该return本身。
使用命名参数并将其他参数替换为相同参数。
经常使用它来“规范化字符串”,使它们预先符合一般模式:
>>> 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'