Bagaimana saya bisa secara selektif melepaskan persen (%) dalam string Python?


364

Saya memiliki kode berikut

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

print(selectiveEscape)

Saya ingin mendapatkan output:

Print percent % in sentence and not have it break.

Apa yang sebenarnya terjadi:

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

57
Kenapa tidak \%? Itu dugaan saya, saya terkejut mendapati itu %%sebagai gantinya - tampaknya cukup berlawanan dengan intuisi.
Demis

3
% iberarti "representasi desimal dari bilangan bulat, berlapis kiri dengan spasi.
Antti Haapala

3
Pelariannya adalah ke fungsi, bukan sintaks bahasa. Oleh karena itu jika melarikan diri \%itu sebenarnya \\%ketika ditulis dalam kode biasa. <escape><escape>adalah pola khas yang pernah saya lihat, dan \kebetulan menjadi karakter pelarian yang paling umum, baik atau buruk.
Shemnon

1
@Demis dan bagaimana Anda melarikan diri \ jika Anda harus mencetak \\%? Anda harus melarikan diri melalui pengulangan karakter khusus, jika karakter khusus juga tidak spesial tergantung keadaan.
Sassa NF

2
Saya pikir itu menjengkelkan dalam Python bahwa% literal dikodekan oleh "%%" dan bukan oleh "\%".
MasterControlProgram

Jawaban:


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
Dalam Python 3.3.5, print('%s%%' % 100)cetakan 100%. Tapi print('%%')cetak %%. Jadi sepertinya Anda tidak perlu keluar dari tanda% jika Anda tidak membuat pergantian.
Zenadix

5
@ Zenadix Ini juga berlaku di Python 2.7
Tom

2
Perhatikan bahwa %metode ini sebenarnya sudah usang (dalam Python 3) yang mendukung str.format(): docs.python.org/2/library/stdtypes.html#str.format
dantiston

8
Perhatikan bahwa %metode ini tidak disusutkan dalam Python 3.6. Ini akan terus didukung sebagai pengganti kemiripannya dengan c, c ++, dll. str.format()Dan f-string lebih disukai tetapi tidak ditegakkan.
Aaron

Hanya perhatikan bahwa Jika string adalah string json, sedang dibaca dari file Anda bahkan tidak perlu melarikan diri dari %tanda. Just %will do
wander95

57

Atau, pada Python 2.6, Anda bisa menggunakan pemformatan string baru (dijelaskan dalam PEP 3101 ):

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

yang sangat berguna karena string Anda menjadi lebih rumit.


+1, sementara saya pikir op sedang mencari jawaban berbasis% saya lebih suka menggunakan formathari ini.
Nolen Royalty

2
Satu-satunya masalah dengan ini adalah ketika teks yang ingin Anda format adalah HTML dengan bagian gaya CSS.
Broseph

Apa yang Anda rekomendasikan untuk memformat teks HTML yang berisi bagian gaya CSS, @Broseph?
DucRP

1
Saya salah. Jika Anda menggunakan kawat gigi ganda di CSS Anda, Anda baik-baik saja.
Broseph


5

Anda tidak dapat melarikan diri secara selektif %, karena %selalu memiliki arti khusus tergantung pada karakter berikut.

Dalam dokumentasi Python, di bawah tabel kedua di bagian itu, ia menyatakan:

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

Karena itu Anda harus menggunakan:

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

(harap perhatikan perubahan ekspisit menjadi tuple sebagai argumen untuk %)

Tanpa mengetahui tentang hal di atas, saya akan melakukan:

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

dengan pengetahuan yang jelas sudah Anda miliki.


3

Jika Templat pemformatan dibaca dari file, dan Anda tidak dapat memastikan konten menggandakan tanda persen, maka Anda mungkin harus mendeteksi karakter persen dan memutuskan secara terprogram apakah itu awal placeholder atau tidak. Kemudian parser juga harus mengenali urutan seperti %d(dan huruf lain yang dapat digunakan), tetapi juga %(xxx)sdll.

Masalah serupa dapat diamati dengan format baru - teks dapat berisi kurung kurawal.


1

Jika Anda menggunakan Python 3.6 atau yang lebih baru, Anda dapat menggunakan 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

Saya telah mencoba berbagai metode untuk mencetak judul subplot, lihat cara kerjanya. Ini berbeda ketika saya menggunakan Lateks.

Ini bekerja dengan '%%' dan 'string' + '%' dalam kasus khusus.

Jika Anda menggunakan Lateks berfungsi dengan menggunakan 'string' + '\%'

Jadi dalam kasus yang khas:

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

Contoh judul dengan%

Jika kami menggunakan lateks:

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

Kami mendapatkan ini: Contoh judul dengan% dan lateks

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.