Como posso escapar seletivamente por cento (%) em seqüências de caracteres Python?


364

eu tenho o seguinte código

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

print(selectiveEscape)

Gostaria de obter a saída:

Print percent % in sentence and not have it break.

O que realmente acontece:

    selectiveEscape = "Use percent % in sentence and not %s" % test
TypeError: %d format: a number is required, not str

57
Por que não é \%? Esse foi o meu palpite, estou surpreso ao descobrir que é %%- parece bastante contra-intuitivo.
Demis

3
% isignifica "uma representação decimal de um número inteiro, acolchoado esquerda com espaços.
Antti Haapala

3
A fuga é para a função, não para a sintaxe da linguagem. Portanto, se a fuga fosse \%, seria realmente \\%quando escrita em código comum. <escape><escape>é o padrão típico que eu já vi e \passa a ser o personagem de escape mais comum, para melhor ou para pior.
Shemnon # 14/16

11
@ Demis e como você foge \ se tivesse que imprimir \\%? É necessário que você escape através da repetição de caracteres especiais, se os caracteres especiais também não forem especiais, dependendo das circunstâncias.
Sassa NF 17/01

2
Eu acho que é chato no Python que o% literal seja codificado por "%%" e não por "\%".
MasterControlProgram

Respostas:


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
No Python 3.3.5, print('%s%%' % 100)imprime 100%. Mas print('%%')imprime %%. Parece que você não precisa escapar dos sinais de% se não fizer substituições.
Zenadix 8/09/15

5
@Zenadix Isto é verdade em Python 2.7, bem
Tom

2
Note-se que o %método é, na verdade, preterido (em Python 3) a favor de str.format(): docs.python.org/2/library/stdtypes.html#str.format
dantiston

8
Observe que o %método não é depreciado no Python 3.6. Ele continuará sendo suportado, em vez de sua semelhança com c, c ++, etc. str.format()e as strings f são preferidas, mas não aplicadas.
Aaron

Só notei que, se a string é uma string json, sendo lida de um arquivo, você nem precisa escapar do %sinal. Só %vai fazer
wander95

57

Como alternativa, a partir do Python 2.6, você pode usar a nova formatação de string (descrita no PEP 3101 ):

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

o que é especialmente útil quando as cordas ficam mais complicadas.


+1, enquanto eu pensava que o op estava procurando uma resposta baseada em%, que eu prefiro usar formathoje em dia.
Nolen Royalty

2
O único problema é quando o texto que você deseja formatar é HTML com uma seção de estilo CSS.
Broseph

O que você recomenda para formatação de texto HTML que contém uma seção de estilo CSS, @Broseph?
DucRP

11
Eu estava errado. Se você usa chaves duplas no seu CSS, está bem.
Broseph


5

Você não pode escapar seletivamente %, pois %sempre tem um significado especial, dependendo do caractere a seguir.

Na documentação do Python, na parte inferior da segunda tabela dessa seção, ele afirma:

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

Portanto, você deve usar:

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

(observe a alteração do déficit para a tupla como argumento para %)

Sem saber o que foi dito acima, eu teria feito:

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

com o conhecimento que você obviamente já tinha.


3

Se o modelo de formatação foi lido de um arquivo e você não pode garantir que o conteúdo duplique o sinal de porcentagem, provavelmente será necessário detectar o caractere de porcentagem e decidir programaticamente se é o início de um espaço reservado ou não. O analisador também deve reconhecer sequências como %d(e outras letras que podem ser usadas), mas também %(xxx)setc.

Problema semelhante pode ser observado com os novos formatos - o texto pode conter chaves.


1

Se você estiver usando o Python 3.6 ou mais recente, poderá usar a string 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.

-3

Eu tentei métodos diferentes para imprimir um título de subtrama, veja como eles funcionam. É diferente quando eu uso o látex.

Funciona com '%%' e 'string' + '%' em um caso típico.

Se você usa o Latex, ele funciona usando 'string' + '\%'

Então, em um caso típico:

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

Exemplos de título com%

Se usarmos látex:

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

Temos o seguinte: exemplo de título com% e látex

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.