示例:
format_string = "http://somedomain.com/%s/%d"
format_string %= ('somestring', %d)
print(format_string)
>>> http://somedomain.com/somestring/%d
有办法做到这一点吗?
答案 0 :(得分:2)
字符串插值要求字符串中的每个“转换规范”都有1个项目。但是,您可以转义另一个%...
的“转换规范”format_string = 'http://somedomain.com/%s/%%d'
print(format_string % 'foo')
当然,一个完整的“黑客”(只有在您尝试替换%s
时才有效)是将另一个转换字符串替换为原始字符串......:
format_string = '%s%s'
print(format_string % ('foo', '%s'))
同样,这可能在您的方案中不起作用......
其他选项是使用.format
样式字符串格式和编写自己的formatter。请注意,这不适合胆小的人 - 但这是一个基本的例子 1 :
import string
class MyFormat(string.Formatter):
def vformat(self, format_string, args, kwargs):
out_lst = []
iargs = iter(args)
for tup in self.parse(format_string):
literal_text, _, format_spec, _ = tup
if literal_text:
out_lst.append(literal_text)
if format_spec:
try:
out_lst.append(format_spec % next(iargs))
except StopIteration:
out_lst.append('{:' + format_spec + '}')
return ''.join(out_lst)
print(MyFormat().format('foo {:%s} {:%d}', 'a', 10)) # foo a 10
print(MyFormat().format('foo {:%s} {:%d}', 'a')) # foo a {:%d}
1 这是我第一次真正写下其中一个......它可能会更干净地完成,我很乐意接受任何改进... < / SUP>
答案 1 :(得分:0)
您可以在字符串中使用字符串格式的组合来实现此目的:
>>> a = '{} is %s'
>>> print a.format('This')
This is %s
>>> print a % 'not good'
{} is not good
但这不是推荐的行为。
答案 2 :(得分:0)
这不是推荐的方式,有点像变通方法,但你可以尝试使用string.replace或re.sub
示例:
format_string.replace("%s", "something")
>>> 'http://somedomain.com/something/%d'
当然,如果您可以使用复杂的字符串格式,那么最好编写自定义格式化程序。但是,如果你的网址很简单,那么这种方法很简单易懂。
你也可以使用这样的函数使它变得通用:
import re
def replace_next(url, value):
return re.sub("%.", str(value), url, count=1)
replace_next(format_string, "something")
>>> 'http://somedomain.com/something/%d'
但是,您可能会在网址中遇到百分比编码,因此您可以获得更多冒险:
import re
def replace_next(url, value):
return re.sub("%\D", str(value), url, count=1)
我希望这可以帮助您解决问题。