Как мога селективно да избягам от процента (%) в низовете на 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

person jondykeman    schedule 21.05.2012    source източник
comment
@KarlKnechtel: Но аз лично съм срещал проблема, когато шаблонът за форматиране беше прочетен от файл. Ако нямате контрол върху това, което е във файла, тогава въпросът е легитимен.   -  person pepr    schedule 22.05.2012
comment
Ако шаблонът за форматиране е във файл, тогава правилният шаблон - включително правилното екраниране на % символи - е отговорност на създателя на файла.   -  person Karl Knechtel    schedule 22.05.2012
comment
Защо не е \%? Това беше моето предположение, с изненада установявам, че вместо това е %% - изглежда доста неинтуитивно.   -  person Demis    schedule 28.04.2015
comment
% i означава десетично представяне на цяло число, подплатено отляво с интервали.   -  person Antti Haapala    schedule 03.04.2016
comment
Бягството е към функцията, а не към синтаксиса на езика. Следователно, ако екранирането беше \%, то всъщност щеше да бъде \\%, когато е написано в обикновен код. <escape><escape> е типичният модел, който съм виждал, а \ се оказва най-често срещаният символ за бягство, за добро или за лошо.   -  person shemnon    schedule 15.10.2016
comment
@Demis и как се избягва \ , ако трябваше да отпечатате \\%? Вие сте длъжни да изисквате бягство чрез повторение на специални знаци, ако специалните знаци също не са специални в зависимост от обстоятелствата.   -  person Sassa NF    schedule 18.01.2017
comment
Мисля, че е досадно в Python литерала % да е кодиран от %%, а не от \%.   -  person MasterControlProgram    schedule 01.11.2017
comment
@Ralf Намирам за по-объркващо, че когато трябва да избягам от % в режим LaTeX, r'\%' не работи, но r'\%%' работи   -  person nish-ant    schedule 19.12.2019


Отговори (6)


Като алтернатива, считано от Python 2.6, можете да използвате ново форматиране на низове (описано в PEP 3101):

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

което е особено удобно, когато вашите низове стават по-сложни.

person Karmel    schedule 21.05.2012
comment
+1, макар да реших, че op търси отговор, базиран на %, много предпочитам да използвам format тези дни. - person Nolen Royalty; 21.05.2012
comment
Единственият проблем с това е, когато текстът, който искате да форматирате, е HTML със секция за CSS стил. - person Broseph; 13.02.2014
comment
Какво препоръчвате за форматиране на текст HTML, който съдържа раздел за CSS стил, @Broseph? - person DucRP; 10.11.2015
comment
Сгреших. Ако използвате двойни скоби във вашия CSS, всичко е наред. - person Broseph; 05.01.2016

опитайте да използвате %% за отпечатване на знак %.

person openmeet123    schedule 21.05.2012

Не можете избирателно да избягвате %, тъй като % винаги има специално значение в зависимост от следващия знак.

В документацията на Python, в долната част на втората таблица в този раздел гласи:

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

Затова трябва да използвате:

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

(моля, обърнете внимание на изричната промяна на tuple като аргумент на %)

Без да знам за горното, щях да направя:

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

със знанията, които очевидно вече сте имали.

person Anthon    schedule 27.11.2016

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

Подобен проблем може да се наблюдава и при новите формати - текстът може да съдържа фигурни скоби.

person pepr    schedule 22.05.2012

Ако използвате Python 3.6 или по-нова версия, можете да използвате f-низ:

>>> test = "have it break."
>>> selectiveEscape = f"Print percent % in sentence and not {test}"
>>> print(selectiveEscape)
... Print percent % in sentence and not have it break.
person Jaroslav Bezděk    schedule 17.01.2020
comment
Би било хубаво да видите как да избягате { тук - person Sailesh Kotha; 08.07.2020
comment
Просто го направете двойно {{ - person Patrik; 21.11.2020

person    schedule
comment
В Python 3.3.5 print('%s%%' % 100) отпечатва 100%. Но print('%%') отпечатва %%. Така че изглежда, че не трябва да избягвате знаците %, ако не правите замествания. - person Zenadix; 08.09.2015
comment
@Zenadix Това е вярно и в Python 2.7 - person Tom; 15.12.2015
comment
Имайте предвид, че методът % всъщност е отхвърлен (в Python 3) в полза на str.format(): docs.python.org/2/library/stdtypes.html#str.format - person dantiston; 20.02.2017
comment
Имайте предвид, че методът % не се амортизира в Python 3.6. Той ще продължи да се поддържа вместо сходството му с c, c++ и т.н. str.format() и f-низовете са предпочитани, но не се прилагат. - person Aaron; 08.04.2017
comment
Току-що забелязах, че ако низът е json низ, когато се чете от файл, дори не е необходимо да избягвате знака %. Само % ще свърши работа - person wander95; 19.12.2017
comment
Можете също така да сте подъл и да направите print "Print percent %" + "variable %s" % 'text' като мръсно решение. - person dragon788; 01.01.2019