如何有选择地在Python字符串中转义百分比(%)?

时间:2012-05-21 00:01:44

标签: python escaping python-2.7

我有以下代码

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

7 个答案:

答案 0 :(得分:547)

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

答案 1 :(得分:53)

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

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

这特别方便,因为你的字符串变得更复杂。

答案 2 :(得分:33)

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

答案 3 :(得分:5)

您无法有选择地转义%,因为%总是具有特殊含义,具体取决于以下字符。

在Python的documentation中,在该部分第二个表的bottem中,它指出:

'%'        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)

凭借你显然已经拥有的知识。

答案 4 :(得分:3)

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

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

答案 5 :(得分:1)

如果您使用的是 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.

答案 6 :(得分:-4)

我尝试过不同的方法来打印子图标题,看看它们是如何工作的。当我使用Latex时,它会有所不同。

在典型情况下,它适用于'%%'和'string'+'%'。

如果您使用Latex,则使用'string'+'\%'

所以在典型案例中:

import matplotlib.pyplot as plt
fig,ax = plt.subplots(4,1)
float_number = 4.17
ax[0].set_title('Total: (%1.2f' %float_number + '\%)')
ax[1].set_title('Total: (%1.2f%%)' %float_number)
ax[2].set_title('Total: (%1.2f' %float_number + '%%)')
ax[3].set_title('Total: (%1.2f' %float_number + '%)')

Title examples with %

如果我们使用乳胶:

import matplotlib.pyplot as plt
import matplotlib
font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 12}
matplotlib.rc('font', **font)
matplotlib.rcParams['text.usetex'] = True
matplotlib.rcParams['text.latex.unicode'] = True
fig,ax = plt.subplots(4,1)
float_number = 4.17
#ax[0].set_title('Total: (%1.2f\%)' %float_number) This makes python crash
ax[1].set_title('Total: (%1.2f%%)' %float_number)
ax[2].set_title('Total: (%1.2f' %float_number + '%%)')
ax[3].set_title('Total: (%1.2f' %float_number + '\%)')

我们得到这个: Title example with % and latex