파이썬 문자열에 리터럴 중괄호 문자를 인쇄하고 .format을 어떻게 사용할 수 있습니까?


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

나에게 준다 : Key Error: Hello\\

출력을 인쇄하고 싶습니다. {Hello} 42



9
중괄호 ( {{ }})를 두 배로 늘리지 않으려면을 사용하십시오 string.Template. $fooLaTeX 코드 생성에 편리한 형식의 식별자로 대체 할 수 있습니다 .
Ioannis Filippidis

두 배의 중괄호를 피하고 Python 프로젝트에 다른 종속성을 추가하지 않으려는 사용자를 위해 사용자 정의 사용자 정의 자리 표시 자 구분 기호 구문을 허용 하여이 문제를 결정적으로 해결하는 Jinja2 도 있습니다 .
dreftymac

답변:


2066

{{and 를 두 배로 늘려야합니다 }}.

>>> 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 ()은 중괄호를 인쇄합니다. 예를 들어 : print "{{something {{}} {0}". format (42)는 "{something {} 42"를 인쇄합니다.
Mark Visser

2
무슨 {0}뜻입니까?
CodyBugstein 2012

6
@Imray : {0}의 첫 번째 인수를 나타냅니다 .format(). {0} {1} {2}에 동일한 개수의 인수를 제공하는 한 하나 이상의 값을 인쇄 할 수 있습니다 .format(). 광범위한 예제는 docs.python.org/library/string.html#format-examples 를 참조하십시오 .
Greg Hewgill

74

중괄호를 두 배로 늘려서 탈출하십시오.

예 :

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

60

파이썬 3.6 이상 (2017)

최신 버전의 Python에서는 f-string을 사용합니다 ( PEP498 참조 ).

f-string을 사용하면 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)

jsonJSON 문자열이 예제보다 복잡해지면 라이브러리를 사용하는 것이 좋습니다.


1
아멘! 더 많은 작업처럼 보일지 모르지만 라이브러리를 사용하여 라이브러리가해야 할 일을하는 것보다 코너를 자르는 것 ... 더 나은 일을합니다.
Kaolin Fire

1
그러나 파이썬 객체의 키 순서는 보장되지 않습니다 ... 여전히 JSON 라이브러리는 JSON 방식으로 직렬화됩니다.
wizzwizz4

2
wizzwizz4 : 좋은 지적입니다. Python 3.6부터 사전은 삽입 순서이므로 문제가되지 않습니다. 2.7에서 3.5 사이의 Python 버전은 콜렉션 라이브러리에서 OrderedDict를 사용할 수 있습니다.
twasbrillig

24

이것을 시도하십시오 :

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


14

더 나은 것은 아니지만 참조를 위해 다음과 같이 할 수도 있습니다.

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

예를 들어 누군가 인쇄하려고 할 때 유용 할 수 있습니다 {argument}. 아마 더 읽기 쉽다'{{{}}}'.format('argument')

Python 2.7 이후 {}에는 인수 위치를 생략합니다 (예 : 대신 {0}).


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 인 문자열이거나 두 개의 문자열을 반복 할 수있는 경우 (다 문자 구분 기호의 경우)에서 작동합니다.


그것에 대해서도 생각했습니다. 물론, 그것도 작동하고 알고리즘이 더 간단합니다. 그러나 이와 같은 텍스트가 많고 여기저기서 매개 변수화하고 싶다고 상상해보십시오. 입력 문자열을 만들 때마다 모든 중괄호를 수동으로 바꾸고 싶지는 않습니다. 여기저기서 매개 변수화를 '드롭'하고 싶을 것입니다. 이 경우,이 방법은 생각하기 쉽고 사용자 관점에서 달성하기 쉽다고 생각합니다. 편리한 기능에 따라 구분 기호를 임의로 선택할 수있는 비슷한 기능을 가진 Linux의 'sed'명령에서 영감을 얻었습니다.
tvt173

요컨대, 유틸리티 함수가 @ $$의 고통보다 매번 사용하는 것보다 조금 더 복잡합니다. 내가 당신의 제안을 오해했다면 알려주십시오.
tvt173


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")

성능에 문제가없는 경우 작업을 수행합니다.


수정이 거의 필요하지 않은 기존 코드에 간단하고 우아하게 통합됩니다. 감사!
Column01

2

문자열에 두 개의 중괄호를 유지해야하는 경우 변수의 각 측면에 5 개의 중괄호가 필요합니다.

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

f- 스트링을 사용하는 경우 5 대신에 한쪽에 4 개의 중괄호를 사용하십시오
TerryA

0

이유는 {}의 구문 .format()이므로 .format()인식하지 못 {Hello}하므로 오류가 발생했습니다.

이중 중괄호 {{}}를 사용하여이를 대체 할 수 있습니다.

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

또는

%s텍스트 형식을 시도하십시오 .

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

0

텍스트를 인쇄하려고 할 때이 문제를 발견하여 붙여 넣기를 라텍스 문서에 복사 할 수 있습니다. 이 답변을 확장하고 명명 된 대체 필드를 사용합니다.

다음과 같은 색인을 사용하여 여러 변수의 곱을 인쇄하고 싶다고 가정 해 보겠습니다 여기에 이미지 설명을 입력하십시오. 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 를 사용 하는 것이 좋습니다 .

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
@ 테오도르 죄송합니다. 이제 원시 문자열로 인쇄 하여이 문제를 해결했습니다.
Harsh Aggarwal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.