x = " \{ Hello \} {0} "
print(x.format(42))
ให้ฉัน : Key Error: Hello\\
ฉันต้องการพิมพ์ผลลัพธ์: {Hello} 42
{{ }}
) string.Template
การใช้งาน มีคุณแทนตัวระบุของแบบฟอร์ม$foo
(สะดวกสำหรับการสร้างรหัส LaTeX)
x = " \{ Hello \} {0} "
print(x.format(42))
ให้ฉัน : Key Error: Hello\\
ฉันต้องการพิมพ์ผลลัพธ์: {Hello} 42
{{ }}
) string.Template
การใช้งาน มีคุณแทนตัวระบุของแบบฟอร์ม$foo
(สะดวกสำหรับการสร้างรหัส LaTeX)
คำตอบ:
คุณต้องเพิ่ม{{
และเป็นสองเท่า}}
:
>>> x = " {{ Hello }} {0} "
>>> print(x.format(42))
' { Hello } 42 '
นี่คือส่วนที่เกี่ยวข้องของเอกสาร Python สำหรับไวยากรณ์สตริงรูปแบบ :
สตริงรูปแบบมี“เขตทดแทน”
{}
ล้อมรอบด้วยวงเล็บปีกกา สิ่งใดก็ตามที่ไม่มีอยู่ในเครื่องหมายปีกกาจะถือเป็นข้อความตัวอักษรซึ่งจะถูกคัดลอกไม่เปลี่ยนแปลงไปยังเอาต์พุต หากคุณต้องการที่จะรวมถึงตัวละครที่รั้งในข้อความตัวอักษรก็สามารถหนีออกมาโดยเพิ่มขึ้น: และ{{
}}
"{{{0}}}".format(42)
!
"{ something { } {value}".format(42)
ไม่ทำงาน
{0}
หมายถึง?
{0}
.format()
คุณสามารถพิมพ์มากกว่าหนึ่งค่าเช่นตราบใดที่คุณให้หมายเลขเดียวกันของข้อโต้แย้ง{0} {1} {2}
.format()
ดูdocs.python.org/library/string.html#format-examplesเพื่อดูตัวอย่าง
คุณหลบหนีได้โดยการจัดฟันสองครั้ง
เช่น:
x = "{{ Hello }} {0}"
print(x.format(42))
Python 3.6+ (2017)
ใน Python เวอร์ชันล่าสุดจะใช้f-strings (ดูที่PEP498 )
ด้วย f-strings เราควรใช้ double {{
หรือ}}
n = 42
print(f" {{Hello}} {n} ")
ผลิตที่ต้องการ
{Hello} 42
หากคุณต้องการแก้ไขการแสดงออกในวงเล็บแทนที่จะใช้ข้อความที่เป็นตัวอักษรคุณจะต้องใช้วงเล็บสามชุด:
hello = "HELLO"
print(f"{{{hello.lower()}}}")
ผลิต
{hello}
OP เขียนความคิดเห็นนี้:
ฉันพยายามจัดรูปแบบ JSON ขนาดเล็กเพื่อวัตถุประสงค์บางอย่างเช่นนี้:
'{"all": false, "selected": "{}"}'.format(data)
เพื่อให้ได้สิ่งที่ต้องการ{"all": false, "selected": "1,2"}
เป็นเรื่องธรรมดาที่ปัญหา "การหลีกเลี่ยงการจัดฟัน" เกิดขึ้นเมื่อจัดการกับ JSON
ฉันขอแนะนำให้ทำสิ่งนี้:
import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)
มันสะอาดกว่าทางเลือกอื่นซึ่งก็คือ:
'{{"all": false, "selected": "{}"}}'.format(data)
การใช้json
ไลบรารีนั้นเป็นที่ต้องการมากกว่าเมื่อสตริง JSON มีความซับซ้อนมากกว่าตัวอย่าง
ลองทำสิ่งนี้:
x = " {{ Hello }} {0} "
print x.format(42)
ลองสิ่งนี้:
x = "{{ Hello }} {0}"
แม้ว่าจะไม่ดีขึ้นเพียงเพื่อการอ้างอิงคุณยังสามารถทำสิ่งนี้ได้:
>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42
{argument}
มันจะมีประโยชน์สำหรับตัวอย่างเช่นเมื่อมีคนต้องการที่จะพิมพ์ มันอาจจะอ่านง่ายกว่า'{{{}}}'.format('argument')
โปรดทราบว่าคุณละเว้นตำแหน่งอาร์กิวเมนต์ (เช่น{}
แทน{0}
) หลังจาก Python 2.7
หากคุณกำลังจะทำสิ่งนี้มากมันเป็นการดีที่จะกำหนดฟังก์ชั่นยูทิลิตี้ที่จะช่วยให้คุณใช้การแทนที่วงเล็บปีกกาโดยพลการแทนเช่น
def custom_format(string, brackets, *args, **kwargs):
if len(brackets) != 2:
raise ValueError('Expected two brackets. Got {}.'.format(len(brackets)))
padded = string.replace('{', '{{').replace('}', '}}')
substituted = padded.replace(brackets[0], '{').replace(brackets[1], '}')
formatted = substituted.format(*args, **kwargs)
return formatted
>>> custom_format('{{[cmd]} process 1}', brackets='[]', cmd='firefox.exe')
'{{firefox.exe} process 1}'
โปรดทราบว่าสิ่งนี้จะใช้ได้กับวงเล็บที่เป็นสตริงที่มีความยาว 2 หรือสามารถซ้ำได้สองสตริง (สำหรับตัวคั่นหลายอักขระ)
ฉันเพิ่งเจอเรื่องนี้เพราะฉันต้องการที่จะฉีดสตริงลงใน JSON ที่ฟอร์แมตแล้ว ทางออกของฉันคือการสร้างวิธีการช่วยเหลือเช่นนี้:
def preformat(msg):
""" allow {{key}} to be used for formatting in text
that already uses curly braces. First switch this into
something else, replace curlies with double curlies, and then
switch back to regular braces
"""
msg = msg.replace('{{', '<<<').replace('}}', '>>>')
msg = msg.replace('{', '{{').replace('}', '}}')
msg = msg.replace('<<<', '{').replace('>>>', '}')
return msg
จากนั้นคุณสามารถทำสิ่งที่ชอบ:
formatted = preformat("""
{
"foo": "{{bar}}"
}""").format(bar="gas")
รับงานที่ทำถ้าประสิทธิภาพไม่ใช่ปัญหา
หากคุณต้องการเก็บวงเล็บปีกกาสองเส้นไว้ในสตริงคุณต้องมีเครื่องหมายปีกกา 5 เส้นในแต่ละด้านของตัวแปร
>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'
เหตุผลคือ{}
เป็นไวยากรณ์.format()
ดังนั้นในกรณีของคุณ.format()
ไม่รู้จัก{Hello}
จึงโยนข้อผิดพลาด
คุณสามารถแทนที่มันได้โดยใช้วงเล็บปีกกาคู่ {{}}
x = " {{ Hello }} {0} "
หรือ
ลอง%s
จัดรูปแบบข้อความ
x = " { Hello } %s"
print x%(42)
ฉันสะดุดปัญหานี้เมื่อพยายามพิมพ์ข้อความซึ่งฉันสามารถคัดลอกแปะลงในเอกสารลาเท็กซ์ได้ ฉันขยายคำตอบนี้และใช้ประโยชน์จากฟิลด์การเปลี่ยนชื่อ:
ให้บอกว่าคุณต้องการพิมพ์ผลิตภัณฑ์ของตัวแปร mulitple ด้วยดัชนีเช่น
ซึ่งใน Latex จะเป็น$A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$
รหัสต่อไปนี้จะทำงานกับเขตข้อมูลที่มีชื่อเพื่อให้ดัชนีจำนวนมากที่อ่านได้:
idx_mapping = {'i1':42, 'i2':3141, 'i3':2178 }
print('$A_{{ {i1:04d} }} * A_{{ {i2:04d} }} * A_{{ {i3:04d} }} * A_{{ {i1:04d} }}$'.format(**idx_mapping))
หากคุณต้องการพิมพ์วงเล็บปีกกาเพียงอันเดียว (เช่น{
) คุณสามารถใช้{{
และคุณสามารถเพิ่มวงเล็บปีกกาเพิ่มเติมในภายหลังในสตริงถ้าคุณต้องการ ตัวอย่างเช่น:
>>> f'{{ there is a curly brace on the left. Oh, and 1 + 1 is {1 + 1}'
'{ there is a curly brace on the left. Oh, and 1 + 1 is 2'
เมื่อคุณแค่พยายามที่จะสอดแทรกสตริงโค้ดที่ฉันแนะนำให้ใช้jinja2ซึ่งเป็นเอ็นจินเทมเพลตที่มีคุณสมบัติครบถ้วนสำหรับ Python เช่น:
from jinja2 import Template
foo = Template('''
#include <stdio.h>
void main() {
printf("hello universe number {{number}}");
}
''')
for i in range(2):
print(foo.render(number=i))
ดังนั้นคุณจะไม่ถูกบังคับให้ทำเครื่องหมายปีกกาซ้ำซ้อนตามคำแนะนำอื่น ๆ ทั้งหมด
คุณสามารถทำได้โดยใช้วิธีการสตริงดิบโดยเพียงแค่เพิ่มตัวอักษร 'r' โดยไม่ต้องใส่เครื่องหมายคำพูดหน้าสตริง
# to print '{I am inside braces}'
print(r'{I am inside braces}')
\{I am inside braces\}
พิมพ์