Вопрос по python, python-2.7 – Как я могу выборочно экранировать проценты (%) в строках Python?

303

У меня есть следующий код

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
Я думаю, что в Python досадно, что буквальный% кодируется как & quot; %% & quot; и не "\%". Ralf
Почему это не так?\%? Это было мое предположение, я удивлен, обнаружив, что это%% вместо этого - кажется довольно нелогичным. Demis
@Demis и как ты убегаешь\  если бы вам пришлось печатать\\%? Вы обязаны требовать экранирования через повторение специальных символов, если специальные символы также не являются специальными в зависимости от обстоятельств. Sassa NF
% i означает «десятичное представление целого числа, дополненное пробелами слева». Antti Haapala
Экранирование - это функция, а не синтаксис языка. Следовательно, если побег был\% это было бы на самом деле\\% когда написано в обычном коде.<escape><escape> типичная картина, которую я видел, и\ случается, самый распространенный побег, к лучшему или к худшему. shemnon

Ваш Ответ

6   ответов
3

и вы не можете гарантировать, что содержимое удваивает знак процента, то вам, вероятно, придется определить символ процента и программно решить, является ли он заполнителем или нет. Тогда синтаксический анализатор также должен распознавать такие последовательности, как%d (и другие буквы, которые можно использовать), но также%(xxx)s и т.п.

Аналогичная проблема наблюдается с новыми форматами - текст может содержать фигурные скобки.

32

%% напечатать знак%.

52

начиная с Python 2.6, вы можете использовать новое форматирование строки (описано вПКП 3101):

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

что особенно удобно, поскольку ваши струны становятся более сложными.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededformatError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
531
>>> test = "have it break."
>>> selectiveEscape = "Print percent %% in sentence and not %s" % test
>>> print selectiveEscape
Print percent % in sentence and not have it break.
Error: User Rate Limit Exceeded%Error: User Rate Limit Exceeded%Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded%Error: User Rate Limit Exceededstr.format(): docs.python.org/2/library/stdtypes.html#str.format
Error: User Rate Limit Exceeded%Error: User Rate Limit Exceededstr.format()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededprint('%s%%' % 100)Error: User Rate Limit Exceeded100%Error: User Rate Limit Exceededprint('%%')Error: User Rate Limit Exceeded%%Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
-3

посмотрите, как они работают. Это отличается, когда я использую латекс.

Он работает с «%%»; и "строка" + "%"; в типичном случае.

Если вы используете латекс, он работает, используя «строку» + «» \% ».

Итак, в типичном случае:

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

Мы получаем это: Пример заголовка с% и латексом

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)

со знанием, которое вы, очевидно, уже имели.

Похожие вопросы