ฉันจะพิมพ์ตัวอักษร curly-brace ได้อย่างไรในสตริงไพ ธ อนและใช้. format กับมัน?


1507
x = " \{ Hello \} {0} "
print(x.format(42))

ให้ฉัน : Key Error: Hello\\

ฉันต้องการพิมพ์ผลลัพธ์: {Hello} 42


1
ดูเพิ่มเติมที่: stackoverflow.com/questions/35574349
dreftymac

9
สำหรับผู้ที่ต้องการที่จะหลีกเลี่ยงการเสแสร้งวงเล็บ ( {{ }}) string.Templateการใช้งาน มีคุณแทนตัวระบุของแบบฟอร์ม$foo(สะดวกสำหรับการสร้างรหัส LaTeX)
Ioannis Filippidis

สำหรับผู้ที่ต้องการหลีกเลี่ยงการจัดฟันสองครั้งและผู้ที่ไม่รังเกียจที่จะเพิ่มการพึ่งพาอื่นให้กับโครงการ Python ของพวกเขายังมีJinja2ซึ่งแก้ไขปัญหานี้อย่างแน่นอนโดยอนุญาตให้ผู้ใช้กำหนดเองตัวคั่นกำหนดไวยากรณ์
dreftymac

คำตอบ:


2066

คุณต้องเพิ่ม{{และเป็นสองเท่า}}:

>>> x = " {{ Hello }} {0} "
>>> print(x.format(42))
' { Hello } 42 '

นี่คือส่วนที่เกี่ยวข้องของเอกสาร Python สำหรับไวยากรณ์สตริงรูปแบบ :

สตริงรูปแบบมี“เขตทดแทน” {}ล้อมรอบด้วยวงเล็บปีกกา สิ่งใดก็ตามที่ไม่มีอยู่ในเครื่องหมายปีกกาจะถือเป็นข้อความตัวอักษรซึ่งจะถูกคัดลอกไม่เปลี่ยนแปลงไปยังเอาต์พุต หากคุณต้องการที่จะรวมถึงตัวละครที่รั้งในข้อความตัวอักษรก็สามารถหนีออกมาโดยเพิ่มขึ้น: และ{{}}


264
ดังนั้นหากคุณต้องการพิมพ์ "{42}" คุณจะต้องใช้"{{{0}}}".format(42)!
hughes

7
ถ้าคุณต้องการปีกกาเดี่ยวล่ะ "{ something { } {value}".format(42)ไม่ทำงาน
AJP

14
"{{" .format () และ "}}". format () พิมพ์วงเล็บปีกกาเดี่ยว ในตัวอย่างของคุณ: พิมพ์ "{{some {{}} {0}". รูปแบบ (42) จะพิมพ์ "{something {} 42"
Mark Visser

2
อะไร{0}หมายถึง?
CodyBugstein

6
@Imray: หมายถึงอาร์กิวเมนต์แรก{0} .format()คุณสามารถพิมพ์มากกว่าหนึ่งค่าเช่นตราบใดที่คุณให้หมายเลขเดียวกันของข้อโต้แย้ง{0} {1} {2} .format()ดูdocs.python.org/library/string.html#format-examplesเพื่อดูตัวอย่าง
Greg Hewgill


60

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}

46

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 มีความซับซ้อนมากกว่าตัวอย่าง


1
สาธุ! อาจดูเหมือนว่าจะทำงานได้มากกว่า แต่การใช้ห้องสมุดเพื่อทำสิ่งที่ห้องสมุดควรทำเมื่อเทียบกับการตัดมุม ... ทำเพื่อสิ่งที่ดีกว่า
ดินขาวไฟ

1
แต่ลำดับของคีย์ในวัตถุ Python ไม่ได้รับการรับรอง ... ถึงกระนั้นห้องสมุด JSON ก็รับประกันว่าจะเป็นอันดับต่อเนื่องในลักษณะ JSON
wizzwizz4

2
wizzwizz4: จุดดี ตั้งแต่ Python 3.6 เป็นต้นไปจะมีการเรียงลำดับพจนานุกรมดังนั้นจึงไม่มีปัญหา เวอร์ชันของ Python ระหว่าง 2.7 และ 3.5 สามารถใช้ OrderedDict จากไลบรารีคอลเลกชัน
twasbrillig



14

แม้ว่าจะไม่ดีขึ้นเพียงเพื่อการอ้างอิงคุณยังสามารถทำสิ่งนี้ได้:

>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42

{argument}มันจะมีประโยชน์สำหรับตัวอย่างเช่นเมื่อมีคนต้องการที่จะพิมพ์ มันอาจจะอ่านง่ายกว่า'{{{}}}'.format('argument')

โปรดทราบว่าคุณละเว้นตำแหน่งอาร์กิวเมนต์ (เช่น{}แทน{0}) หลังจาก Python 2.7


5

หากคุณกำลังจะทำสิ่งนี้มากมันเป็นการดีที่จะกำหนดฟังก์ชั่นยูทิลิตี้ที่จะช่วยให้คุณใช้การแทนที่วงเล็บปีกกาโดยพลการแทนเช่น

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 หรือสามารถซ้ำได้สองสตริง (สำหรับตัวคั่นหลายอักขระ)


คิดเกี่ยวกับเรื่องนั้นด้วย แน่นอนว่ามันจะใช้ได้เช่นกันและอัลกอริทึมก็ง่ายกว่า แต่ลองจินตนาการว่าคุณมีข้อความจำนวนมากเช่นนี้และคุณต้องการกำหนดพารามิเตอร์ที่นี่และที่นั่น ทุกครั้งที่คุณสร้างสตริงอินพุตคุณจะไม่ต้องการแทนที่วงเล็บปีกกาทั้งหมดด้วยตนเอง คุณเพียงแค่ต้องการ 'วาง' พารามิเตอร์ของคุณที่นี่และที่นั่น ในกรณีนี้ฉันคิดว่าวิธีนี้ง่ายต่อการคิดและทำจากมุมมองของผู้ใช้ ฉันได้รับแรงบันดาลใจจากคำสั่ง 'sed' ของ linux ซึ่งมีความสามารถคล้ายกันในการเลือกตัวคั่นของคุณตามความสะดวก
tvt173

ในระยะสั้นฉันอยากให้ฟังก์ชั่นยูทิลิตี้มีความซับซ้อนมากกว่าการใช้ @ $$ เพื่อใช้งานทุกครั้ง โปรดแจ้งให้เราทราบหากฉันเข้าใจข้อเสนอของคุณผิด
tvt173

ฉันได้ไปข้างหน้าและเพิ่มการสาธิตสั้น ๆ ใน public.lab space ของฉันgithub.com/dreftymac/public.lab/blob/master/topic/python/…
dreftymac

3

ฉันเพิ่งเจอเรื่องนี้เพราะฉันต้องการที่จะฉีดสตริงลงใน 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")

รับงานที่ทำถ้าประสิทธิภาพไม่ใช่ปัญหา


เรียบง่ายและสง่างามเพื่อรวมเข้ากับโค้ดที่มีอยู่โดยไม่จำเป็นต้องทำการปรับเปลี่ยนเล็กน้อย ขอบคุณ!
คอลัมน์ 01

2

หากคุณต้องการเก็บวงเล็บปีกกาสองเส้นไว้ในสตริงคุณต้องมีเครื่องหมายปีกกา 5 เส้นในแต่ละด้านของตัวแปร

>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'

สำหรับผู้ที่ใช้ f-strings ให้ใช้เครื่องหมายปีกกา 4 อันที่ด้านใดด้านหนึ่งแทน 5
TerryA

0

เหตุผลคือ{}เป็นไวยากรณ์.format()ดังนั้นในกรณีของคุณ.format()ไม่รู้จัก{Hello}จึงโยนข้อผิดพลาด

คุณสามารถแทนที่มันได้โดยใช้วงเล็บปีกกาคู่ {{}}

x = " {{ Hello }} {0} "

หรือ

ลอง%sจัดรูปแบบข้อความ

x = " { Hello } %s"
print x%(42)  

0

ฉันสะดุดปัญหานี้เมื่อพยายามพิมพ์ข้อความซึ่งฉันสามารถคัดลอกแปะลงในเอกสารลาเท็กซ์ได้ ฉันขยายคำตอบนี้และใช้ประโยชน์จากฟิลด์การเปลี่ยนชื่อ:

ให้บอกว่าคุณต้องการพิมพ์ผลิตภัณฑ์ของตัวแปร 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))

-1

หากคุณต้องการพิมพ์วงเล็บปีกกาเพียงอันเดียว (เช่น{) คุณสามารถใช้{{และคุณสามารถเพิ่มวงเล็บปีกกาเพิ่มเติมในภายหลังในสตริงถ้าคุณต้องการ ตัวอย่างเช่น:

>>> 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'

-1

เมื่อคุณแค่พยายามที่จะสอดแทรกสตริงโค้ดที่ฉันแนะนำให้ใช้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))

ดังนั้นคุณจะไม่ถูกบังคับให้ทำเครื่องหมายปีกกาซ้ำซ้อนตามคำแนะนำอื่น ๆ ทั้งหมด


-3

คุณสามารถทำได้โดยใช้วิธีการสตริงดิบโดยเพียงแค่เพิ่มตัวอักษร 'r' โดยไม่ต้องใส่เครื่องหมายคำพูดหน้าสตริง

# to print '{I am inside braces}'
print(r'{I am inside braces}')

สวัสดี! คุณอาจต้องการตรวจสอบอีกครั้งว่า; งูหลาม 3.7 \{I am inside braces\}พิมพ์
Teodor

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