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
\%
? 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.
\%
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.
\
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.
>>> test = "have it break."
>>> selectiveEscape = "Print percent %% in sentence and not %s" % test
>>> print selectiveEscape
Print percent % in sentence and not have it break.
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.
try using %%
to print % sign .
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.
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.
{{
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.
Success story sharing
print('%s%%' % 100)
prints100%
. Butprint('%%')
prints%%
. So it looks like you don't have to escape the % signs if you don't make substitutions.%
method is actually deprecated (in Python 3) in favor ofstr.format()
: docs.python.org/2/library/stdtypes.html#str.format%
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.%
sign. Just%
will do