ChatGPT解决这个技术问题 Extra ChatGPT

How can I selectively escape percent (%) in Python strings?

I have the following code

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

print(selectiveEscape)

I would like to get the output:

Print percent % in sentence and not have it break.

What actually happens:

    selectiveEscape = "Use percent % in sentence and not %s" % test
TypeError: %d format: a number is required, not str
Why isn't it \%? That was my guess, I'm surprised to find it's %% instead - seems pretty counterintuitive.
% i means "a decimal representation of an integer, padded left with spaces.
The escape is to the function, not the language syntax. Hence if the escape was \% it would actually be \\% when written in ordinary code. <escape><escape> is the typical pattern I've seen, and \ happens to be the most common escape character, for better or worse.
@Demis and how do you escape \ if you had to print \\%? You are bound to require escaping through repetition of special characters, if the special characters are also not special depending on circumstances.
I think it is annoying in Python that the the literal % is encoded by "%%" and not by "\%".

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.

In Python 3.3.5, print('%s%%' % 100) prints 100%. But print('%%') prints %%. So it looks like you don't have to escape the % signs if you don't make substitutions.
@Zenadix This is true in Python 2.7 as well
Note that the % method is actually deprecated (in Python 3) in favor of str.format(): docs.python.org/2/library/stdtypes.html#str.format
Note that the % method is not depreciated in Python 3.6. It will continue to be supported in lieu of its similarity to c, c++, etc. str.format() and f-strings are preferred but not enforced.
Just noticed that If the string is a json string, being read from a file you don't even need to escape the % sign. Just % will do
K
Karmel

Alternatively, as of Python 2.6, you can use new string formatting (described in PEP 3101):

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

which is especially handy as your strings get more complicated.


The only problem with this is when the text you want to format is HTML with a CSS style section.
What do you recommend for text formatting HTML that contains a CSS style section, @Broseph?
I was wrong. If you use double braces in your CSS you are fine.
B
Botz3000

try using %% to print % sign .


A
Anthon

You can't selectively escape %, as % always has a special meaning depending on the following character.

In the documentation of Python, at the bottem of the second table in that section, it states:

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

Therefore you should use:

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

(please note the expicit change to tuple as argument to %)

Without knowing about the above, I would have done:

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

with the knowledge you obviously already had.


J
Jaroslav Bezděk

If you are using Python 3.6 or newer, you can use 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.

Would be nice to see how to escape { here
You just make it double {{
p
pepr

If the formatting template was read from a file, and you cannot ensure the content doubles the percent sign, then you probably have to detect the percent character and decide programmatically whether it is the start of a placeholder or not. Then the parser should also recognize sequences like %d (and other letters that can be used), but also %(xxx)s etc.

Similar problem can be observed with the new formats -- the text can contain curly braces.