Як я можу вибірково уникнути відсотків (%) у рядках Python?


364

У мене є такий код

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
Чому це не так \%? Це було моє здогадка, я здивований, що виявив це %%замість цього - здається, досить протизаконним.
Деміс

3
% iозначає "десяткове зображення цілого числа, прокладене ліворуч з пробілами.
Антті Хаапала,

3
Вихід полягає у функції, а не синтаксисі мови. Отже, якби втеча була, \%вона насправді була б, \\%коли вона написана у звичайному коді. <escape><escape>- це типова картина, яку я бачив, і, здається, \є найпоширенішим персонажем втечі, в кращу сторону чи гірше.
Шемнон

1
@Demis і як уникнути, \ якщо довелося друкувати \\%? Вам обов'язково потрібно буде втекти через повторення спеціальних символів, якщо спеціальні символи також не є особливими в залежності від обставин.
Сасса НФ

2
Я думаю, що в Python дратує, що буквальний% кодується "%%", а не "\%".
MasterControlProgram

Відповіді:


625
>>> 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)друкується 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, читаючи з файлу, вам навіть не потрібно уникати %знаку. Просто %зроблять
бродити95

57

Як варіант Python 2.6, ви можете використовувати нове форматування рядків (описане в PEP 3101 ):

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

що особливо зручно, оскільки ваші струни ускладнюються.


+1, тоді як я подумав, що оп шукає відповідь на основі%, яку я найбільше вважаю за краще використовувати format сьогодні.
Nolen Royalty

2
Єдина проблема з цим полягає в тому, коли текст, який ви хочете відформатувати, - це HTML з розділом стилю CSS.
Бросеф

Що ви рекомендуєте для HTML-форматування тексту, що містить розділ стилю CSS, @Broseph?
DucRP

1
Я помилявся. Якщо ви використовуєте подвійні дужки у своєму CSS, у вас все добре.
Брозеф


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і т.д.

Аналогічну проблему можна спостерігати з новими форматами - текст може містити фігурні дужки.


1

Якщо ви використовуєте 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.

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

Ми отримуємо це: Приклад заголовка із% та латексом

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.