字符串包含“%s”而不转义时的Python字符串格式

时间:2010-05-17 07:27:53

标签: python string-formatting

格式化字符串时,我的字符串可能包含我不希望转换的模"%"。我可以转义字符串并将每个"%"更改为"%%"作为解决方法。

例如,

'Day old bread, 50%% sale %s' % 'today!'  

输出:

'Day old bread, 50% sale today'

但有逃避的替代方案吗?我希望使用dict可以使Python忽略任何非关键字转换 例如,

'Day old bread, 50% sale %(when)s' % {'when': 'today'}  

但是Python仍然会看到第一个模%并给出:

TypeError: not enough arguments for format string

4 个答案:

答案 0 :(得分:24)

您可以(并且应该)使用new string .format() method(如果您使用的是Python 2.6或更高版本):

"Day old bread, 50% sale {0}".format("today")

The manual can be found here

文档还说,旧的%格式最终将从语言中删除,尽管这肯定需要一些时间。新的格式化方法更强大,所以这是一件好事。

答案 1 :(得分:2)

不是真的 - 转义你的%符号是你使用字符串格式化所付出的代价。您可以使用字符串连接:'Day old bread, 50% sale ' + whichday如果有帮助......

答案 2 :(得分:2)

将'%'转换为'%%'不是一种解决方法。如果您使用字符串格式来表示'%'符号。如果您不想这样,您可以随时执行以下操作:

print "Day old bread, 50% sale " + "today"

e.g。不使用格式。

请注意,使用字符串连接时,请确保该变量是字符串(而不是例如None)或使用str(varName)。否则你会得到类似'无法连接str和NoneType'的内容。

答案 3 :(得分:2)

您可以使用正则表达式将%替换为%%,其中%后面没有(

def format_with_dict(str, dictionary):
    str = re.sub(r"%([^\(])", r"%%\1", str)
    str = re.sub(r"%$", r"%%", str)  # There was a % at the end?
    return str % dictionary

这样:

print format_with_dict('Day old bread, 50% sale %(when)s', {'when': 'today'})

将输出:

  

日龄面包,今天50%销售

此方法有助于避免格式字符串"没有足够的参数。错误。