ฉันจะเลือกยกเว้นเปอร์เซ็นต์ (%) ในสตริง 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
ทำไมไม่เป็นเช่นนั้น\%? นั่นคือการเดาของฉันฉันประหลาดใจที่พบว่ามัน%%แทน - ดูเหมือนจะค่อนข้างใช้งานง่าย
Demis

3
% iหมายถึง "การแสดงทศนิยมของจำนวนเต็มเบาะซ้ายด้วยช่องว่าง
Antti Haapala

3
การหลีกเลี่ยงเป็นการทำงานไม่ใช่ไวยากรณ์ของภาษา ดังนั้นหากการหลบหนีคือ\%มันจะเป็นจริง\\%เมื่อเขียนในรหัสธรรมดา <escape><escape>เป็นรูปแบบทั่วไปที่ฉันเคยเห็นและ\เกิดขึ้นกับตัวละครในการหลบหนีที่พบได้บ่อยที่สุดว่าดีขึ้นหรือแย่ลง
shemnon

1
@Demis และคุณจะหนี\ อย่างไรถ้าคุณต้องพิมพ์\\%? คุณจำเป็นต้องหลบหนีผ่านการทำซ้ำอักขระพิเศษหากอักขระพิเศษนั้นไม่พิเศษขึ้นอยู่กับสถานการณ์
Sassa NF

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
ในหลาม 3.3.5, พิมพ์print('%s%%' % 100) 100%แต่พิมพ์print('%%') %%ดังนั้นดูเหมือนว่าคุณไม่จำเป็นต้องหลีกเลี่ยงเครื่องหมาย% ถ้าคุณไม่ทำการทดแทน
Zenadix

5
@Zenadix สิ่งนี้เป็นจริงใน Python 2.7 เช่นกัน
Tom

2
โปรดทราบว่า%วิธีการนั้นเลิกใช้จริง (ใน Python 3) เพื่อประโยชน์str.format(): docs.python.org/2/library/stdtypes.html#str.format
dantiston

8
โปรดทราบว่า%วิธีการไม่ได้คิดค่าเสื่อมราคาใน Python 3.6 มันจะยังคงได้รับการสนับสนุนแทนความคล้ายคลึงกับ c, c ++ str.format()และอื่น ๆและเป็นที่ต้องการ f-strings แต่ไม่บังคับใช้
แอรอน

เพิ่งสังเกตเห็นว่าหากสตริงเป็นสตริง json การอ่านจากไฟล์คุณไม่จำเป็นต้องหนีจาก%สัญลักษณ์ เพียงแค่%จะทำ
wander95

57

หรืออีกวิธีหนึ่งใน Python 2.6 คุณสามารถใช้การจัดรูปแบบสตริงใหม่ (อธิบายไว้ในPEP 3101 ):

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

ซึ่งมีประโยชน์เป็นพิเศษเนื่องจากสตริงของคุณมีความซับซ้อนมากขึ้น


+1 ในขณะที่ฉันคิดว่า op กำลังมองหาคำตอบที่มี% -based ฉันชอบที่จะใช้formatวันนี้
Nolen Royalty

2
ปัญหาเดียวของปัญหานี้คือเมื่อข้อความที่คุณต้องการจัดรูปแบบคือ HTML ที่มีส่วนสไตล์ CSS
Broseph

สิ่งใดที่คุณแนะนำสำหรับการจัดรูปแบบข้อความ HTML ที่มีส่วนสไตล์ CSS, @Broseph
DucRP

1
ฉันผิดไป. หากคุณใช้เครื่องหมายปีกกาคู่ใน CSS ของคุณคุณก็ไม่เป็นไร
Broseph


5

คุณไม่สามารถเลือกที่จะหลบหนี%ได้เช่น%เคยมีความหมายพิเศษขึ้นอยู่กับตัวละครต่อไปนี้

ในเอกสารของ Python ที่ส่วนท้ายของตารางที่สองในส่วนนั้นระบุ:

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

ดังนั้นคุณควรใช้:

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

(โปรดทราบการเปลี่ยนแปลง expup เพื่อ tuple เป็นอาร์กิวเมนต์%)

โดยไม่ทราบเกี่ยวกับข้างต้นฉันจะทำ:

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' + '%' ในกรณีทั่วไป

หากคุณใช้ลาเท็กซ์มันจะทำงานโดยใช้ '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 + '\%)')

เราได้สิ่งนี้: ตัวอย่างหัวเรื่องด้วย% และลาเท็กซ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.