ChatGPT解决这个技术问题 Extra ChatGPT

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

我有以下代码

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> 是我见过的典型模式,而 \ 恰好是最常见的转义字符,无论好坏。
@Demis,如果您必须打印 \\%,您如何逃避 \ ?如果特殊字符根据情况也不是特殊的,则必然需要通过重复特殊字符来进行转义。
我认为在 Python 中,文字 % 是由“%%”而不是“\%”编码的,这很烦人。

N
Nolen Royalty
>>> 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 3.3.5 中,print('%s%%' % 100) 打印 100%。但是 print('%%') 打印 %%。因此,如果您不进行替换,看起来您不必逃避 % 符号。
@Zenadix 这在 Python 2.7 中也是如此
请注意,% 方法实际上已被弃用(在 Python 3 中)以支持 str.format()docs.python.org/2/library/stdtypes.html#str.format
请注意,% 方法在 Python 3.6 中并未贬值。它将继续得到支持,以代替它与 c、c++ 等的相似性。str.format() 和 f 字符串是首选但不强制执行。
刚刚注意到,如果字符串是 json 字符串,则从文件中读取您甚至不需要转义 % 符号。只需 % 即可
K
Karmel

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

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

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


唯一的问题是当您要格式化的文本是带有 CSS 样式部分的 HTML 时。
对于包含 CSS 样式部分 @Broseph 的文本格式 HTML,您有什么建议?
我错了。如果你在你的 CSS 中使用双括号就可以了。
B
Botz3000

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


A
Anthon

您不能选择性地转义 %,因为 % 始终具有特殊含义,具体取决于以下字符。

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

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


J
Jaroslav Bezděk

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

很高兴看到如何逃脱{在这里
你只要把它加倍{{
p
pepr

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

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