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


363

我有以下代码

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

57
为什么不呢\%?那是我的猜测,我很惊讶地发现它是%%-似乎违反直觉。
Demis 2015年

3
% i机构“的一个整数的十进制表示,补齐留下的空间。
的Antti哈帕拉

3
转义是函数,而不是语言语法。因此,如果是转义符\%,实际上是\\%在用普通代码编写时。 <escape><escape>是我所见过的典型模式\,无论好坏,它恰好是最常见的转义字符。
希农

1
@Demis,\ 如果必须打印,如何逃脱\\%?如果特殊字符在某些情况下也不特殊,则必须通过特殊字符的转义来进行转义。
Sassa NF

2
我认为在Python中,字面量%是由“ %%”而不是“ \%”编码的,这很烦人。
MasterControlProgram

Answers:


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

38
在Python 3.3.5中,print('%s%%' % 100)prints 100%。但是print('%%')打印%%。因此,如果您不进行替换,则看起来不必逃脱%符号。
Zenadix

5
@Zenadix这是在Python 2.7也是如此
汤姆

2
请注意,%实际上不赞成使用此方法(在Python 3中),而推荐使用str.format()docs.python.org/2/library/stdtypes.html#str.format
dantiston

8
请注意,该%方法在Python 3.6中并未弃用。它会继续获得支持,以代替与c,c ++等的相似性str.format()。f字符串是首选但不强制使用。
亚伦

只是注意到,如果该字符串是json字符串,那么从文件中读取它甚至不需要转义%符号。只是%会做
wander95 '17

57

另外,从Python 2.6开始,您可以使用新的字符串格式(如PEP 3101中所述):

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

当您的弦变得越来越复杂时,这尤其方便。


+1,而我发现op在寻找基于百分比的答案时,我最近更喜欢使用format
Nolen Royalty

2
唯一的问题是,当您要格式化的文本是带有CSS样式部分的HTML时。
Broseph 2014年

对于包含CSS样式节@Broseph的HTML文本格式,您有什么建议?
DucRP

1
我错了。如果在CSS中使用双括号,就可以了。
Broseph


5

您不能选择性地转义%,因为%根据以下字符,它总是具有特殊的含义。

在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)

显然你已经有了知识。


3

如果从文件中读取了格式模板,并且不能确保内容将百分号加倍,则可能必须检测百分号并以编程方式确定它是否是占位符的开始。然后,解析器还应该识别类似%d(以及可以使用的其他字母)之类的序列,也应如此%(xxx)s

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



-3

我尝试了不同的方法来打印子图标题,看看它们是如何工作的。当我使用乳胶时,情况有所不同。

在典型情况下,它适用于'%%'和'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 + '%)')

带有%的标题示例

如果我们使用乳胶:

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

我们得到这样的结果: 具有%和乳胶的标题示例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.