我有以下代码
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
\%
?这是我的猜测,我惊讶地发现它是 %%
- 似乎很违反直觉。
% i
表示“整数的十进制表示,用空格填充。
\%
,那么在用普通代码编写时它实际上是 \\%
。 <escape><escape>
是我见过的典型模式,而 \
恰好是最常见的转义字符,无论好坏。
\\%
,您如何逃避 \
?如果特殊字符根据情况也不是特殊的,则必然需要通过重复特殊字符来进行转义。
>>> test = "have it break."
>>> selectiveEscape = "Print percent %% in sentence and not %s" % test
>>> print selectiveEscape
Print percent % in sentence and not have it break.
或者,从 Python 2.6 开始,您可以使用新的字符串格式(在 PEP 3101 中描述):
'Print percent % in sentence and not {0}'.format(test)
当您的字符串变得更加复杂时,这特别方便。
尝试使用 %%
打印 % 符号。
您不能选择性地转义 %
,因为 %
始终具有特殊含义,具体取决于以下字符。
在 Python 的 documentation 中,在该部分第二个表的底部,它指出:
'%' 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)
有了你显然已经拥有的知识。
如果您使用的是 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.
{{
如果格式模板是从文件中读取的,并且您无法确保内容将百分号加倍,那么您可能必须检测百分号字符并以编程方式确定它是否是占位符的开头。然后解析器还应该识别像 %d
(和其他可以使用的字母)这样的序列,还有 %(xxx)s
等。
使用新格式可以观察到类似的问题——文本可以包含花括号。
print('%s%%' % 100)
打印100%
。但是print('%%')
打印%%
。因此,如果您不进行替换,看起来您不必逃避 % 符号。%
方法实际上已被弃用(在 Python 3 中)以支持str.format()
:docs.python.org/2/library/stdtypes.html#str.format%
方法在 Python 3.6 中并未贬值。它将继续得到支持,以代替它与 c、c++ 等的相似性。str.format()
和 f 字符串是首选但不强制执行。%
符号。只需%
即可