string — 일반적인 문자열 연산

string — 일반적인 문자열 연산

string 모듈은 문자열 처리에 사용되는 상수와 헬퍼 함수, 그리고 FormatterTemplate 클래스를 제공합니다.

출처: Python documentation

본문

See also

  • 시퀀스 타입 — str
  • 문자열 메서드(String Methods)

문자열 상수

이 모듈에 정의된 상수는:

  • string.ascii_letters — 아래 설명하는 ascii_lowercaseascii_uppercase 상수의 연결. 이 값은 로케일에 의존하지 않습니다.
  • string.ascii_lowercase — 소문자 'abcdefghijklmnopqrstuvwxyz'. 이 값은 로케일에 의존하지 않으며 변경되지 않습니다.
  • string.ascii_uppercase — 대문자 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. 이 값은 로케일에 의존하지 않으며 변경되지 않습니다.
  • string.digits — 문자열 '0123456789'.
  • string.hexdigits — 문자열 '0123456789abcdefABCDEF'.
  • string.octdigits — 문자열 '01234567'.
  • string.punctuation — C 로케일에서 구두점 문자로 간주되는 ASCII 문자 문자열: !"#$%&'()*+,-./:;<=>?@[\]^_{|}~`.
  • string.printable — Python이 인쇄 가능으로 간주하는 ASCII 문자 문자열. digits, ascii_letters, punctuation, whitespace의 조합입니다.

    Note 설계상 string.printable.isprintable()False를 반환합니다. 특히 string.printable은 POSIX 의미에서 인쇄 가능하지 않습니다(LC_CTYPE 참고).

  • string.whitespace — 공백으로 간주되는 모든 ASCII 문자를 포함하는 문자열. 여기에는 공백, 탭, 줄 바꿈, 캐리지 리턴, 폼 피드, 세로 탭 문자가 포함됩니다.

사용자 정의 문자열 포매팅

내장 문자열 클래스는 PEP 3101에 설명된 format() 메서드를 통해 복잡한 변수 치환과 값 포매팅을 수행하는 기능을 제공합니다. string 모듈의 Formatter 클래스는 내장 format() 메서드와 같은 구현을 사용하여 자신만의 문자열 포매팅 동작을 만들고 사용자 정의할 수 있게 합니다.

string.Formatter

Formatter 클래스는 다음 공개 메서드를 가집니다.

  • **format(format_string, /, *args, kwargs) — 기본 API 메서드. 포맷 문자열과 임의의 위치 및 키워드 인자 집합을 받습니다. vformat()을 호출하는 래퍼일 뿐입니다.

    versionchanged: 3.7에서 포맷 문자열 인자는 이제 위치 전용(positional-only)입니다.

  • vformat(format_string, args, kwargs) — 이 함수는 포매팅의 실제 작업을 수행합니다. *args**kwargs 문법을 사용하여 사전을 개별 인자로 언패킹하고 다시 패킹하는 대신 미리 정의된 인자 사전을 전달하려는 경우를 위해 별도의 함수로 노출됩니다. vformat()은 포맷 문자열을 문자 데이터와 치환 필드로 분해하는 작업을 수행합니다. 아래 설명하는 다양한 메서드를 호출합니다.

또한 Formatter는 하위 클래스에 의해 교체되도록 의도된 여러 메서드를 정의합니다.

  • parse(format_string)format_string을 반복하고 튜플 (literal_text, field_name, format_spec, conversion)의 iterable을 반환합니다. 이것은 vformat()이 문자열을 리터럴 텍스트 또는 치환 필드로 분해하는 데 사용됩니다.
    • 튜플의 값은 개념적으로 리터럴 텍스트 범위 다음에 단일 치환 필드를 나타냅니다. 리터럴 텍스트가 없으면(두 치환 필드가 연속적으로 발생하면 가능) literal_text는 길이가 0인 문자열이 됩니다. 치환 필드가 없으면 field_name, format_spec, conversion의 값은 None이 됩니다. field_name의 값은 수정되지 않으며 번호가 매겨지지 않은 위치 필드의 자동 번호 매기기는 vformat()이 수행합니다.
  • get_field(field_name, args, kwargs)field_name이 주어지면 포맷할 객체로 변환합니다. parse()에서 반환된 field_name의 자동 번호 매기기는 이 메서드를 호출하기 전에 vformat()이 수행합니다. 튜플 (obj, used_key)를 반환합니다. 기본 버전은 PEP 3101에 정의된 "0[name]" 또는 "label.title"과 같은 형태의 문자열을 받습니다. argskwargsvformat()에 전달된 대로입니다. 반환 값 used_keyget_value()key 매개변수와 같은 의미를 가집니다.
  • get_value(key, args, kwargs) — 주어진 필드 값을 검색합니다. key 인자는 정수 또는 문자열이 됩니다. 정수이면 args의 위치 인자 인덱스를 나타내고, 문자열이면 kwargs의 명명된 인자를 나타냅니다.
    • args 매개변수는 vformat()의 위치 인자 목록으로, kwargs 매개변수는 키워드 인자 사전으로 설정됩니다.
    • 복합 필드 이름의 경우 이 함수들은 필드 이름의 첫 구성 요소에 대해서만 호출됩니다. 이후 구성 요소는 일반 속성 및 인덱싱 연산을 통해 처리됩니다.
    • 예를 들어 필드 표현 '0.name'get_value()가 키 인자 0으로 호출되게 합니다. name 속성은 get_value()가 반환한 후 내장 getattr() 함수를 호출하여 조회됩니다.
    • 인덱스나 키워드가 존재하지 않는 항목을 참조하면 IndexError 또는 KeyError가 발생해야 합니다.
  • check_unused_args(used_args, args, kwargs) — 원하면 사용되지 않은 인자에 대한 검사를 구현합니다. 이 함수의 인자는 포맷 문자열에서 실제로 참조된 모든 인자 키의 집합(위치 인자는 정수, 명명 인자는 문자열)과 vformat에 전달된 argskwargs에 대한 참조입니다. 사용되지 않은 인자 집합은 이러한 매개변수로부터 계산할 수 있습니다. check_unused_args()는 검사가 실패하면 예외를 발생시키는 것으로 간주됩니다.
  • format_field(value, format_spec)format_field()는 단순히 전역 format() 내장 함수를 호출합니다. 하위 클래스가 재정의할 수 있도록 메서드가 제공됩니다.
  • convert_field(value, conversion) — 변환 유형(parse() 메서드가 반환한 튜플에서와 같이)이 주어지면(get_field()가 반환한) 값을 변환합니다. 기본 버전은 's'(str), 'r'(repr), 'a'(ascii) 변환 유형을 이해합니다.

포맷 문자열 문법

str.format() 메서드와 Formatter 클래스는 포맷 문자열에 대해 같은 문법을 공유합니다(Formatter의 경우 하위 클래스가 자신만의 포맷 문자열 문법을 정의할 수 있음). 이 문법은 포맷된 문자열 리터럴 및 템플릿 문자열 리터럴의 문법과 관련이 있지만 덜 정교하며, 특히 삽입에서 임의 표현식을 지원하지 않습니다.

포맷 문자열에는 중괄호 {}로 둘러싸인 "치환 필드(replacement fields)"가 포함됩니다. 중괄호에 포함되지 않은 것은 출력에 그대로 복사되는 리터럴 텍스트로 간주됩니다. 리터럴 텍스트에 중괄호 문자를 포함해야 한다면 {{}}로 두 배로 늘려 이스케이프할 수 있습니다.

치환 필드의 문법은 다음과 같습니다:

replacement_field: "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name:        arg_name ("." attribute_name | "[" element_index "]")*
arg_name:          [identifier | digit+]
attribute_name:    identifier
element_index:     digit+ | index_string
index_string:      <any source character except "]"> +
conversion:        "r" | "s" | "a"
format_spec:       format-spec:format_spec

덜 형식적인 용어로, 치환 필드는 출력에 치환 필드 대신 포맷되고 삽입될 객체를 지정하는 field_name으로 시작할 수 있습니다. field_name 뒤에는 선택적으로 느낌표 '!'가 앞에 오는 conversion 필드와 콜론 ':'이 앞에 오는 format_spec이 올 수 있습니다. 이것들은 치환 값에 대한 비기본 포맷을 지정합니다.

포맷 지정 미니 언어 섹션도 참고하세요.

field_name 자체는 숫자 또는 키워드인 arg_name으로 시작합니다. 숫자이면 위치 인자를, 키워드이면 명명된 키워드 인자를 나타냅니다. 문자열에 대한 str.isdecimal() 호출이 참을 반환하면 arg_name은 숫자로 처리됩니다. 포맷 문자열의 숫자 arg_name이 0, 1, 2, … 순서로 있으면 모두 생략할 수 있고 0, 1, 2, … 숫자가 자동으로 그 순서로 삽입됩니다. arg_name은 따옴표로 구분되지 않으므로 포맷 문자열 내에서 임의의 사전 키(예: 문자열 '10' 또는 ':-]')를 지정할 수 없습니다. arg_name 뒤에는 임의 개수의 인덱스 또는 속성 표현이 올 수 있습니다. '.name' 형태의 표현은 getattr()을 사용하여 명명된 속성을 선택하고, '[index]' 형태의 표현은 __getitem__()을 사용하여 인덱스 조회를 수행합니다.

versionchanged: 3.1에서 위치 인자 지정자는 str.format()에 대해 생략될 수 있으므로 '{}{}'.format(a, b)'{0}{1}'.format(a, b)와 동등합니다.

versionchanged: 3.4에서 위치 인자 지정자는 Formatter에 대해 생략될 수 있습니다.

몇 가지 간단한 포맷 문자열 예제:

"First, thou shalt count to {0}"  # References first positional argument
"Bring me a {}"                   # Implicitly references the first positional argument
"From {} to {}"                   # Same as "From {0} to {1}"
"My quest is {name}"              # References keyword argument 'name'
"Weight in tons {0.weight}"       # 'weight' attribute of first positional arg
"Units destroyed: {players[0]}"   # First element of keyword argument 'players'.

conversion 필드는 포매팅 전에 타입 강제 변환을 수행합니다. 일반적으로 값 포매팅 작업은 값 자체의 __format__() 메서드에 의해 수행됩니다. 그러나 어떤 경우에는 자신의 포매팅 정의를 재정의하여 타입을 문자열로 포매팅하도록 강제하는 것이 바람직합니다. __format__()을 호출하기 전에 값을 문자열로 변환함으로써 정상적인 포매팅 논리는 우회됩니다.

현재 세 가지 변환 플래그가 지원됩니다: 값에 대해 str()을 호출하는 '!s', repr()을 호출하는 '!r', ascii()를 호출하는 '!a'.

몇 가지 예:

"Harold's a clever {0!s}"        # Calls str() on the argument first
"Bring out the holy {name!r}"    # Calls repr() on the argument first
"More {!a}"                      # Calls ascii() on the argument first

format_spec 필드는 필드 너비, 정렬, 패딩, 소수 정밀도와 같은 세부 사항을 포함하여 값이 어떻게 제시되어야 하는지에 대한 사양을 포함합니다. 각 값 유형은 자신만의 "포맷팅 미니 언어" 또는 format_spec 해석을 정의할 수 있습니다.

대부분의 내장 유형은 다음 섹션에서 설명하는 공통 포맷팅 미니 언어를 지원합니다.

format_spec 필드는 내부에 중첩된 치환 필드를 포함할 수도 있습니다. 이러한 중첩 치환 필드는 필드 이름, 변환 플래그, 포맷 사양을 포함할 수 있지만 더 깊은 중첩은 허용되지 않습니다. format_spec 내의 치환 필드는 format_spec 문자열이 해석되기 전에 치환됩니다. 이렇게 하면 값의 포매팅을 동적으로 지정할 수 있습니다.

포맷 지정 미니 언어

"포맷 지정(Format specifications)"은 포맷 문자열에 포함된 치환 필드 내부에서 개별 값이 어떻게 제시되는지 정의하는 데 사용됩니다(포맷 문자열 문법, f-strings, t-strings 참고). 또한 내장 format() 함수에 직접 전달할 수 있습니다. 각 포맷 가능 타입은 포맷 사양이 어떻게 해석되어야 하는지 정의할 수 있습니다.

대부분의 내장 타입은 포맷 사양에 대해 다음 옵션을 구현하지만 일부 포맷팅 옵션은 숫자 타입만 지원합니다.

일반적인 관례는 빈 포맷 사양이 값에 대해 str()을 호출한 것과 같은 결과를 생성하는 것입니다. 비어 있지 않은 포맷 사양은 일반적으로 결과를 수정합니다.

표준 포맷 지정자의 일반적인 형태:

format_spec:             [options][width_and_precision][type]
options:                 [[fill]align][sign]["z"]["#"]["0"]
fill:                    <any character>
align:                   "<" | ">" | "=" | "^"
sign:                    "+" | "-" | " "
width_and_precision:     [width_with_grouping][precision_with_grouping]
width_with_grouping:     [width][grouping]
precision_with_grouping: "." [precision][grouping] | "." grouping
width:                   digit+
precision:               digit+
grouping:                "," | "_"
type:                    "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g"
                         | "G" | "n" | "o" | "s" | "x" | "X" | "%"

유효한 align 값이 지정되면 그 앞에 채움 문자(fill character)가 올 수 있습니다. 채움 문자는 어떤 문자든 될 수 있으며 생략하면 기본값은 공백입니다. 포맷된 문자열 리터럴이나 str.format() 메서드를 사용할 때 채움 문자로 리터럴 중괄호("{" 또는 "}")를 사용할 수 없습니다. 그러나 중첩 치환 필드로 중괄호를 삽입하는 것은 가능합니다. 이 제한은 format() 함수에는 영향을 미치지 않습니다.

다양한 정렬 옵션의 의미:

옵션 의미
'<' 사용 가능한 공간 내에서 필드를 왼쪽 정렬하도록 강제합니다(대부분 객체의 기본값).
'>' 사용 가능한 공간 내에서 필드를 오른쪽 정렬하도록 강제합니다(숫자의 기본값).
'=' 부호(있는 경우) 뒤에 있지만 숫자 앞에 패딩을 배치하도록 강제합니다. '+000000120' 형태의 필드를 인쇄하는 데 사용됩니다. 이 정렬 옵션은 복소수를 제외한 숫자 타입에만 유효합니다. '0'이 필드 너비 바로 앞에 오면 숫자의 기본값이 됩니다.
'^' 사용 가능한 공간 내에서 필드를 가운데 정렬하도록 강제합니다.

최소 필드 너비가 정의되지 않으면 필드 너비는 항상 채울 데이터와 같은 크기이므로 이 경우 정렬 옵션은 의미가 없습니다.

sign 옵션은 숫자 타입에만 유효하며 다음 중 하나일 수 있습니다:

옵션 의미
'+' 양수와 음수 모두에 부호를 사용해야 함을 나타냅니다.
'-' 음수에만 부호를 사용해야 함을 나타냅니다(기본 동작).
' ' (space) 양수에는 앞에 공백을, 음수에는 빼기 부호를 사용해야 함을 나타냅니다.

'z' 옵션은 반올림 후 음수 0 부동소수점 값을 양수 0으로 강제 변환합니다. 이 옵션은 부동소수점 표시 타입에만 유효합니다.

versionchanged: 3.11에서 'z' 옵션이 추가되었습니다(PEP 682 참고).

'#' 옵션은 변환에 대해 "대체 형식(alternate form)"이 사용되게 합니다. 대체 형식은 타입마다 다르게 정의됩니다. 이 옵션은 정수, float, complex 타입에만 유효합니다. 정수의 경우 이진, 팔진 또는 16진수 출력이 사용될 때 이 옵션은 출력 값에 각각 '0b', '0o', '0x' 또는 '0X' 접두사를 추가합니다. float와 complex의 경우 대체 형식은 변환 결과가 뒤에 숫자가 없어도 항상 소수점 문자를 포함하게 합니다. 일반적으로 소수점 문자는 숫자가 뒤따르는 경우에만 이러한 변환 결과에 나타납니다. 또한 'g''G' 변환의 경우 결과에서 뒤따르는 0이 제거되지 않습니다.

width는 접두사, 구분자 및 기타 포맷팅 문자를 포함한 최소 전체 필드 너비를 정의하는 십진 정수입니다. 지정되지 않으면 필드 너비는 내용에 의해 결정됩니다.

명시적 정렬이 주어지지 않을 때 너비 필드 앞에 0('0') 문자를 두면 복소수를 제외한 숫자 타입에 대해 부호 인식 0 채우기(sign-aware zero-padding)가 활성화됩니다. 이것은 '=' 정렬 유형의 '0' 채움 문자와 동등합니다.

versionchanged: 3.10에서 너비 필드 앞에 '0'을 두는 것이 문자열의 기본 정렬에 더 이상 영향을 미치지 않습니다.

precision은 소수점 뒤에 표시할 자릿수('f''F' 표시 타입) 또는 소수점 앞뒤로 표시할 자릿수('g' 또는 'G' 표시 타입)를 나타내는 십진 정수입니다. 문자열 표시 타입의 경우 필드는 최대 필드 크기를 나타냅니다. 즉, 필드 내용에서 사용될 문자 수입니다. precision은 정수 표시 타입에는 허용되지 않습니다.

widthprecision 필드 뒤의 grouping 옵션은 각각 숫자의 정수 부분과 소수 부분에 대한 자릿수 그룹 구분자를 지정합니다. 다음 중 하나일 수 있습니다:

옵션 의미
',' 정수 표시 타입 'd'와 부동소수점 표시 타입('n' 제외)에 대해 3자리마다 쉼표를 삽입합니다. 다른 표시 타입에는 이 옵션이 지원되지 않습니다.
'_' 정수 표시 타입 'd'와 부동소수점 표시 타입('n' 제외)에 대해 3자리마다 밑줄을 삽입합니다. 정수 표시 타입 'b', 'o', 'x', 'X'의 경우 밑줄은 4자리마다 삽입됩니다. 다른 표시 타입에는 이 옵션이 지원되지 않습니다.

로케일 인식 구분자를 위해서는 'n' float 표시 타입 또는 정수 표시 타입을 사용하세요.

versionchanged: 3.1에서 ',' 옵션이 추가되었습니다(PEP 378 참고).

versionchanged: 3.6에서 '_' 옵션이 추가되었습니다(PEP 515 참고).

versionchanged: 3.14에서 소수 부분에 대한 grouping 옵션 지원.

마지막으로 type은 데이터가 어떻게 제시되어야 하는지 결정합니다.

사용 가능한 문자열 표시 타입:

타입 의미
's' 문자열 포맷. 문자열의 기본 타입이며 생략할 수 있습니다.
None 's'와 같음.

사용 가능한 정수 표시 타입:

타입 의미
'b' 이진 포맷. 숫자를 2진수로 출력합니다.
'c' 문자. 인쇄 전에 정수를 해당 유니코드 문자로 변환합니다.
'd' 십진 정수. 숫자를 10진수로 출력합니다.
'o' 팔진 포맷. 숫자를 8진수로 출력합니다.
'x' 16진 포맷. 9보다 큰 자리에 소문자를 사용하여 숫자를 16진수로 출력합니다.
'X' 16진 포맷. 9보다 큰 자리에 대문자를 사용하여 숫자를 16진수로 출력합니다. '#'가 지정되면 '0x' 접두사도 '0X'로 대문자화됩니다.
'n' 숫자. 현재 로케일 설정을 사용하여 적절한 자릿수 그룹 구분자를 삽입한다는 점을 제외하면 'd'와 같습니다. 기본 로케일은 시스템 로케일이 아닙니다. 사용 사례에 따라 'n'을 사용하기 전에 locale.setlocale()LC_NUMERIC을 설정할 수 있습니다.
None 'd'와 같음.

위의 표시 타입 외에도 정수는 아래 나열된 부동소수점 표시 타입('n'None 제외)으로 포맷할 수 있습니다. 그렇게 할 때 포매팅 전에 정수를 부동소수점 수로 변환하기 위해 float()가 사용됩니다.

float와 Decimal 값에 대한 사용 가능한 표시 타입:

타입 의미
'e' 과학 표기법. 주어진 정밀도 p에 대해 계수와 지수를 구분하는 문자 'e'와 함께 과학 표기법으로 숫자를 포맷합니다. 계수는 소수점 앞에 한 자리, 뒤에 p 자리를 가져 총 p+1 유효 자릿수입니다. 정밀도가 주어지지 않으면 float에 대해 소수점 뒤 6자리 정밀도를 사용하고 Decimal에 대해 모든 계수 자릿수를 표시합니다. p=0이면 # 옵션을 사용하지 않는 한 소수점이 생략됩니다. float의 경우 지수는 항상 적어도 두 자리를 포함하며 값이 0이면 지수는 0입니다.
'E' 과학 표기법. 구분 문자로 대문자 'E'를 사용한다는 점을 제외하면 'e'와 같습니다.
'f' 고정 소수점 표기법. 주어진 정밀도 p에 대해 소수점 뒤 정확히 p 자릿수를 가진 십진수로 숫자를 포맷합니다. 정밀도가 주어지지 않으면 float에 대해 소수점 뒤 6자리 정밀도를 사용하고 Decimal에 대해 모든 계수 자릿수를 표시할 만큼 큰 정밀도를 사용합니다. p=0이면 # 옵션을 사용하지 않는 한 소수점이 생략됩니다.
'F' 고정 소수점 표기법. 'f'와 같지만 nan을 NAN으로, inf를 INF로 변환합니다.
'g' 일반 포맷. 주어진 정밀도 p>=1에 대해 숫자를 p 유효 자릿수로 반올림한 다음 그 크기에 따라 결과를 고정 소수점 포맷 또는 과학 표기법으로 포맷합니다. 정밀도 0은 정밀도 1과 동등한 것으로 처리됩니다. 정확한 규칙: 표시 타입 'e'와 정밀도 p-1로 포맷된 결과가 지수 exp를 가진다고 가정합니다. 그런 다음 float에 대해 m은 -4이고 Decimal에 대해 -6인 m<=exp<p이면 숫자는 표시 타입 'f'와 정밀도 p-1-exp로 포맷됩니다. 그렇지 않으면 숫자는 표시 타입 'e'와 정밀도 p-1로 포맷됩니다. 두 경우 모두 중요하지 않은 뒤따르는 0이 significand에서 제거되고, '#' 옵션을 사용하지 않는 한 뒤따르는 자릿수가 없으면 소수점도 제거됩니다. 정밀도가 주어지지 않으면 float에 대해 6 유효 자릿수 정밀도를 사용합니다. Decimal의 경우 결과의 계수는 값의 계수 자릿수로 구성됩니다. 절대값이 1e-6보다 작은 값과 최하위 자릿수의 자리값이 1보다 큰 값에는 과학 표기법이 사용되고, 그렇지 않으면 고정 소수점 표기법이 사용됩니다. 양수 및 음수 무한대, 양수 및 음수 0, nan은 정밀도와 관계없이 각각 inf, -inf, 0, -0, nan으로 포맷됩니다.
'G' 일반 포맷. 숫자가 너무 커지면 'E'로 전환한다는 점을 제외하면 'g'와 같습니다. 무한대와 NaN의 표현도 대문자화됩니다.
'n' 숫자. 숫자의 정수 부분에 대해 적절한 자릿수 그룹 구분자를 삽입하기 위해 현재 로케일 설정을 사용한다는 점을 제외하면 'g'와 같습니다. 기본 로케일은 시스템 로케일이 아닙니다. 사용 사례에 따라 'n'을 사용하기 전에 locale.setlocale()LC_NUMERIC을 설정할 수 있습니다.
'%' 백분율. 숫자에 100을 곱하고 고정('f') 포맷으로 표시한 다음 퍼센트 기호로 끝냅니다.
None float의 경우 'g' 타입과 같지만, 결과를 포맷할 때 고정 소수점 표기법을 사용하면 항상 소수점 뒤에 적어도 한 자리를 포함하고 exp>=p-1일 때 과학 표기법으로 전환합니다. 정밀도가 지정되지 않으면 후자는 주어진 값을 충실히 나타내는 데 필요한 만큼 커집니다. Decimal의 경우 현재 소수 컨텍스트의 context.capitals 값에 따라 'g' 또는 'G'와 같습니다. 전체 효과는 다른 포맷 수정자에 의해 변경된 str()의 출력과 일치하는 것입니다.

결과는 소수점 뒤 p 자릿수의 주어진 정밀도로 올바르게 반올림되어야 합니다. float의 반올림 모드는 내장 round()와 일치합니다. Decimal의 경우 현재 컨텍스트의 반올림 모드가 사용됩니다.

complex에 대한 사용 가능한 표시 타입은 float와 같습니다('%'는 허용되지 않음). complex 숫자의 실수와 허수 구성 요소는 모두 지정된 표시 타입에 따라 부동소수점 숫자로 포맷됩니다. 이것들은 허수 부분의 필수 부호로 구분되며, 후자는 j 접미사로 끝납니다. 표시 타입이 없으면 결과는 다른 포맷 수정자에 의해 변경된 str()의 출력(0이 아닌 실수 부분을 가진 complex 숫자는 괄호로도 둘러싸임)과 일치합니다.

포맷 예제

이 섹션에는 str.format() 문법의 예제와 이전 %-포맷팅과의 비교가 포함되어 있습니다.

대부분의 경우 문법은 {}의 추가와 % 대신 : 사용을 제외하면 이전 %-포맷팅과 유사합니다. 예를 들어 '%03.2f''{:03.2f}'로 변환될 수 있습니다.

새 포맷 문법은 다음 예제에 표시된 새롭고 다른 옵션도 지원합니다.

위치로 인자에 접근:

>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c')  # 3.1+ only
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc')      # unpacking argument sequence
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad')   # arguments' indices can be repeated
'abracadabra'

이름으로 인자에 접근:

>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'

인자의 속성에 접근:

>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part {0.real} '
...  'and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'

인자의 항목에 접근:

>>> coord = (3, 5)
>>> 'X: {0[0]};  Y: {0[1]}'.format(coord)
'X: 3;  Y: 5'

%s%r 대체:

>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"

텍스트 정렬 및 너비 지정:

>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'

부호 지정:

>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # show it always
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14)  # show a space for positive numbers
' 3.140000; -3.140000'
>>> '{:-f}; {:-f}'.format(3.14, -3.14)  # show only the minus -- same as '{:f}; {:f}'
'3.140000; -3.140000'

다른 진법으로 값 변환:

>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

숫자 그룹 구분자로 쉼표 또는 밑줄 사용:

>>> '{:,}'.format(1234567890)
'1,234,567,890'
>>> '{:_}'.format(1234567890)
'1_234_567_890'
>>> '{:_b}'.format(1234567890)
'100_1001_1001_0110_0000_0010_1101_0010'
>>> '{:_x}'.format(1234567890)
'4996_02d2'

백분율 표현:

>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'

타입별 포매팅 사용:

>>> import datetime as dt
>>> d = dt.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'

템플릿 문자열 ($-문자열)

Note

여기서 설명하는 기능은 Python 2.4에서 도입되었습니다. 정규식에 기반한 간단한 템플릿 방법입니다. 그것은 str.format(), 포맷된 문자열 리터럴, 템플릿 문자열 리터럴보다 앞섭니다.

Python 3.14에서 도입된 템플릿 문자열 리터럴(t-strings)과는 관련이 없습니다. 이것들은 string.templatelib 모듈에 있는 string.templatelib.Template 객체로 평가됩니다.

템플릿 문자열은 PEP 292에 설명된 대로 더 간단한 문자열 치환을 제공합니다. 템플릿 문자열의 주요 사용 사례는 국제화(i18n)입니다. 그 맥락에서 더 간단한 문법과 기능은 Python의 다른 내장 문자열 포매팅 기능보다 번역하기 쉽기 때문입니다. i18n을 위해 템플릿 문자열에 기반한 라이브러리의 예로 flufl.i18n 패키지를 참고하세요.

템플릿 문자열은 다음 규칙을 사용하여 $-기반 치환을 지원합니다.

  • $$는 이스케이프이며 단일 $로 대체됩니다.
  • $identifier는 매핑 키 "identifier"와 일치하는 치환 자리 표시자를 지정합니다. 기본적으로 "identifier"는 밑줄 또는 ASCII 문자로 시작하는 대소문자 무시 ASCII 영숫자 문자열(밑줄 포함)로 제한됩니다. $ 문자 뒤의 첫 번째 비식별자 문자가 이 자리 표시자 지정을 종료합니다.
  • ${identifier}$identifier와 동등합니다. 유효한 식별자 문자가 자리 표시자 뒤에 오지만 자리 표시자의 일부가 아닐 때(예: "${noun}ification") 필요합니다.

문자열에서 $의 다른 모든 출현은 ValueError가 발생하게 합니다.

string 모듈은 이러한 규칙을 구현하는 Template 클래스를 제공합니다.

  • string.Template(template) — 생성자는 단일 인자(템플릿 문자열)를 받습니다.
  • **substitute(mapping={}, /, kwds) — 템플릿 치환을 수행하고 새 문자열을 반환합니다. mapping은 템플릿의 자리 표시자와 일치하는 키를 가진 사전과 유사한 객체입니다. 또는 키워드 인자(키워드가 자리 표시자)를 제공할 수 있습니다. mappingkwds가 모두 주어지고 중복이 있으면 kwds의 자리 표시자가 우선합니다.
  • **safe_substitute(mapping={}, /, kwds)substitute()와 같지만 mappingkwds에 자리 표시자가 없으면 KeyError 예외를 발생시키는 대신 원래 자리 표시자가 결과 문자열에 그대로 나타납니다. 또한 substitute()와 달리 $의 다른 모든 출현은 ValueError를 발생시키는 대신 단순히 $를 반환합니다.
    • 다른 예외가 여전히 발생할 수 있지만, 이 메서드는 예외를 발생시키는 대신 항상 사용 가능한 문자열을 반환하려고 하므로 "안전"이라고 불립니다. 다른 의미에서 safe_substitute()는 매달린 구분자, 일치하지 않는 중괄호 또는 유효한 Python 식별자가 아닌 자리 표시자를 포함하는 잘못된 형식의 템플릿을 조용히 무시할 수 있으므로 안전하지 않은 것일 수 있습니다.
  • is_valid() — 템플릿에 substitute()ValueError를 발생시킬 잘못된 자리 표시자가 있으면 False를 반환합니다.

    versionadded: 3.11.

  • get_identifiers() — 잘못된 식별자를 무시하고 처음 나타나는 순서대로 템플릿의 유효한 식별자 목록을 반환합니다.

    versionadded: 3.11.

Template 인스턴스는 하나의 공개 데이터 속성도 제공합니다.

  • template — 생성자의 template 인자에 전달된 객체. 일반적으로 변경해서는 안 되지만 읽기 전용 접근은 강제되지 않습니다.

Template 사용 방법의 예:

>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'

고급 사용: Template의 하위 클래스를 파생하여 자리 표시자 문법, 구분자 문자 또는 템플릿 문자열을 파싱하는 데 사용되는 전체 정규식을 사용자 정의할 수 있습니다. 이를 위해 다음 클래스 속성을 재정의할 수 있습니다.

  • delimiter — 자리 표시자를 도입하는 구분자를 설명하는 리터럴 문자열. 기본값은 $. 구현이 필요에 따라 이 문자열에 re.escape()을 호출하므로 정규식이어서는 안 됩니다. 또한 클래스 생성 후에는 구분자를 변경할 수 없습니다(즉, 다른 구분자는 하위 클래스의 클래스 네임스페이스에 설정되어야 합니다).
  • idpattern — 중괄호 없는 자리 표시자의 패턴을 설명하는 정규식. 기본값은 정규식 (?a:[_a-z][_a-z0-9]*). 이것이 주어지고 braceidpatternNone이면 이 패턴은 중괄호 자리 표시자에도 적용됩니다.

    Note 기본 flags가 re.IGNORECASE이므로 패턴 [a-z]는 일부 비-ASCII 문자와 일치할 수 있습니다. 그래서 여기서 로컬 a 플래그를 사용합니다. versionchanged: 3.7에서 braceidpattern을 사용하여 중괄호 안과 밖에서 사용되는 별도의 패턴을 정의할 수 있습니다.

  • braceidpatternidpattern과 같지만 중괄호 자리 표시자의 패턴을 설명합니다. 기본값은 None으로 idpattern으로 대체됨을 의미합니다(즉, 중괄호 안과 밖에서 같은 패턴이 사용됨). 주어지면 중괄호 및 중괄호 없는 자리 표시자에 대해 다른 패턴을 정의할 수 있습니다.

    versionadded: 3.7.

  • flags — 치환을 인식하는 데 사용되는 정규식을 컴파일할 때 적용될 정규식 플래그. 기본값은 re.IGNORECASE. re.VERBOSE는 항상 플래그에 추가되므로 사용자 지정 idpattern은 verbose 정규식 규칙을 따라야 합니다.

    versionadded: 3.2.

또는 클래스 속성 pattern을 재정의하여 전체 정규식 패턴을 제공할 수 있습니다. 이렇게 하면 값은 4개의 명명된 캡처 그룹이 있는 정규식 패턴 문자열 또는 컴파일된 정규식 객체여야 합니다. 캡처 그룹은 위에 주어진 규칙과 잘못된 자리 표시자 규칙에 해당합니다.

  • escaped — 이 그룹은 기본 패턴에서 $$와 같은 이스케이프 시퀀스와 일치합니다.
  • named — 이 그룹은 중괄호 없는 자리 표시자 이름과 일치합니다. 캡처 그룹에 구분자를 포함해서는 안 됩니다.
  • braced — 이 그룹은 중괄호로 둘러싸인 자리 표시자 이름과 일치합니다. 캡처 그룹에 구분자나 중괄호를 포함해서는 안 됩니다.
  • invalid — 이 그룹은 다른 구분자 패턴(보통 단일 구분자)과 일치하며 정규식에서 마지막에 나타나야 합니다.

이 클래스의 메서드는 패턴이 명명된 그룹 중 하나와 일치하지 않고 템플릿과 일치하면 ValueError를 발생시킵니다.

헬퍼 함수

  • string.capwords(s, sep=None)str.split()을 사용하여 인자를 단어로 분할하고, str.capitalize()를 사용하여 각 단어를 대문자화하고, str.join()을 사용하여 대문자화된 단어를 연결합니다. 선택적 두 번째 인자 sep가 없거나 None이면 공백 문자 연속 실행은 단일 공백으로 대체되고 앞뒤 공백이 제거됩니다. 그렇지 않으면 sep가 단어를 분할하고 연결하는 데 사용됩니다.

더 알아보기 (Learn more)