422

我有以下代码

test = "have it break."
selectiveEscape = "Print percent % in sentence and not %s" % test

print(selectiveEscape)

我想得到输出:

Print percent % in sentence and not have it break.

实际发生的情况:

    selectiveEscape = "Use percent % in sentence and not %s" % test
TypeError: %d format: a number is required, not str
4

6 回答 6

711
>>> test = "have it break."
>>> selectiveEscape = "Print percent %% in sentence and not %s" % test
>>> print selectiveEscape
Print percent % in sentence and not have it break.
于 2012-05-21T00:03:43.890 回答
62

或者,从 Python 2.6 开始,您可以使用新的字符串格式(在PEP 3101中描述):

'Print percent % in sentence and not {0}'.format(test)

当您的字符串变得更加复杂时,这特别方便。

于 2012-05-21T00:12:34.227 回答
45

尝试使用%%打印 % 符号。

于 2012-05-21T07:46:33.257 回答
10

您不能有选择地 escape %,因为%根据以下字符始终具有特殊含义。

在Python的文档中,在该部分第二个表的底部,它指出:

'%'        No argument is converted, results in a '%' character in the result.

因此,您应该使用:

selectiveEscape = "Print percent %% in sentence and not %s" % (test, )

(请注意显式更改为元组作为参数%

在不了解上述情况的情况下,我会这样做:

selectiveEscape = "Print percent %s in sentence and not %s" % ('%', test)

有了你显然已经拥有的知识。

于 2016-11-27T12:24:06.463 回答
4

如果您使用的是Python 3.6或更高版本,则可以使用f-string

>>> test = "have it break."
>>> selectiveEscape = f"Print percent % in sentence and not {test}"
>>> print(selectiveEscape)
... Print percent % in sentence and not have it break.
于 2020-01-17T11:42:48.240 回答
3

如果格式模板是从文件中读取的,并且您不能确保内容将百分号加倍,那么您可能必须检测百分号并以编程方式确定它是否是占位符的开头。然后解析器还应该识别像%d(和其他可以使用的字母)这样的序列,还有%(xxx)s等等。

使用新格式可以观察到类似的问题——文本可以包含花括号。

于 2012-05-22T07:27:15.160 回答