有没有办法只替换部分格式字符串?

时间:2015-06-04 05:06:36

标签: python

示例:

format_string  = "http://somedomain.com/%s/%d"
format_string %= ('somestring', %d)
print(format_string)
>>> http://somedomain.com/somestring/%d

有办法做到这一点吗?

3 个答案:

答案 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)

我希望这可以帮助您解决问题。