달력

0

« 2025/6 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2016. 7. 7. 12:54

string 프로그래밍/Python2016. 7. 7. 12:54

string

https://docs.python.org/3/library/string.html



6.1.3 Format String Syntax


1. 포맷 문자열은 중괄호 {}로 된 치환 필드를 포함한다.

2. 중괄호 안에 포함된 모든 것은 일반 텍스트로 간주되고 출력물에는 변경 없이 그대로 복사된다.

3. 일반 텍스트로 중괄호를 표현한다면 중괄호를 두개 써라. {{ 또는 }}


replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
arg_name          ::=  [identifier | integer]
attribute_name    ::=  identifier
element_index     ::=  integer | index_string
index_string      ::=  <any source character except "]"> +
conversion        ::=  "r" | "s" | "a"
format_spec       ::=  <described in the next section>

4. 버전 3.1부터 위치 인수 지정자를 생략할 수 있다. 예) '{} {}' 은 '{0] {1]' 과 같다.

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


6.1.3.1. Format Specification Mini-Language


1. 일부 포맷 옵션들은 숫자 형에서만 지원된다.

2. 일반 변환에서 빈 포맷 문자열("")은 값에 str()을 호출한 것과 같은 결과를 가진다.

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

3. 유효한 align 값이 지정되면, 모든 문자가 가능한 fill 문자가 앞에 올 수 있고 생략되면 기본값은 공백이 된다.

4. str.format() 메서드를 사용할 때 fill 문자로 중괄호("{" 또는 "}")의 사용은 불가능하다.

11. 그러나 중첩된 교체 필드로 중괄호를 삽입하는 것은 가능하다.

12. 제한은(limitation)은 format() 함수에 영향을 미치지 않는다.

13. 다양한 맞춤(alignment) 옵션의 의미는 다음과 같다.

 Option

 Meaning

 '<'

 필드를 이용 가능한 공간 내에서 왼쪽 맞춤한다. (대부분의 객체의 기본값이다.)

 '>'

 필드를 이용 가능한 공간 내에서 오른쪽 맞춤한다. (숫자의 기본값)

 '='

 1. 패딩이 기호 뒤에 오고 숫자 앞에 온다. '+000000120' 형태에서 프린팅 필드에 사용된다.

 2. 이 맞춤 옵션은 숫자 형식에서만 유효하다.

 3. '0'이 필드 너비 앞에 바로 오면 기본값이 된다.

 '^' 필드가 이용 가능한 공간 공간 내에서 가운데에 위치한다.

14. 최소 필드 너비가 정의되지 않으면 필드 너비는 데이터와 같은 크기가 된다.

15. 그래서 이런 경우 맞춤 옵션이 의미가 없다.

16. sign 옵션은 숫자 형에서만 유효하고 다음 중에 하나가 될 수 있다.

Option

Meaning

 +

 양수, 음수 모두에 사용

 -

 음수에만 사용 (기본값)

 space

 양수에는 앞에 공백이, 음수에는 마이너스 기호가 사용


17. '#' 옵션은 '대체 형식'(alternate form)을 변환에 사용되도록 한다.

18. 이 옵션은 integer, float, comples와 Decimal types에만 유효

19. integers인 경우 binary, octal, hexadecimal 출력이면, 각각의 프리픽스를'0b', '0o', '0x' 출력 값에 추가한다.

20. floats, comples와 Decimal의 경우 대체 형식은 변환 결과가 항상 소수점을 포함하도록 한다.

21. 숫자가 뒤에 오지 않더라도 포함한다.

22. 'g', 'G' 변환에서는 뒤에 0들이 제거되지 않는다.


23. ',' 옵션은 천단위 컴마 사용입니다.

24. 지역 인식 구분자는 'n' integer presentation type을 사용.


# 버전 3.1에서 ',' 옵션 추가됨


25. 명시적 alignment가 없다면 width 필드 앞에 0이 오면 기호 인식 제로 패딩을 적용한다.

26. precision은 'f' 및 'F' 로 포맷된 부동 소수점 값의 소수 점 뒤에 또는 'g'와 'G'로 포맷된 부동 소수점 값의 소수 점 앞 뒤에 표시되는 숫자를 decimal 숫자이다.

27. 숫자가 아닌 형식에서 precision은 최대 필드 크기이다. 다시 말해서 필드 내용의 문자의 수이다.

28. integer 값에는 허용되지 않는다.


29. 마지막으로 type은 데이터 타입을 결정한다.


30. 문자열 가능 형식

 Type

 Meaning

 's'

 문자열 포맷, 문자열의 기본형이고 생략가능하다.

 None

 's'와 같다.


31. 정수형 가능 형식

 Type

 Meaning

 'b'

 바이너리 포맷. 2진수

 'c'

 문자. 출력 전에 integer를 해당 유니코드 문자로 변환

 'd'

 Decimal Integer. 10진수

 'o'

 Octal 포맷. 8진수

 'x'

 16진수. 소문자

 'X'

 16진수. 대문자

 'n'

 숫자. 현재 로케일 환경을 사용해서 적절한 숫자 구분자 문자를 삽입을 제외하고는 'd'와 같다.

 None

 'd'와 같다.


31. integers는 아래 목록의 부동 소수점 타입으로 ('n'와 None 제외) 포맷될 수 있다

32. 그러면 float()이 사용되어 integer를 부동소수점 값으로 바꾼다.


33. 부동 소수점 형식과 decimal 의 가능한 값

 Type

 Meaning

 'e'

 지수 표기법. 'e' 사용. 기본 자릿수는 6

 'E'

 지수 표기법. 'E' 사용.

 'f'

 부동 소수점. 기본 소수 자릿수는 6

 'F'

 부동 소수점. 'f'와 같지만, nan을 NAN으로 ini를 INF로 변환

 'g'

 일반적인 포맷

 'G'

 일반적인 포맷. 숫자가 너무 커지면 "E"로 변환되는 것을 빼고는 'g'와 같다. infinity와 NaN은 대문자화

 'n'

 숫자. 'g'와 같지만 현재 로케일 설정을 사용해서 적절한 구분자를 삽입

 '%'

 퍼센트. 숫자를 100으로 곱하고 'f' 포맷으로 표시. % 기호가 뒤에 옴

 None

  'g'와 비슷. 고정 소수점 표기법이 사용되면 소수 점 이후에 최소 하나의 숫자를 가진다




예제


1. 여기에서는 str.format() 문법과 구식 %-포맷팅을 비교한다.

2. 대부분의 경우 구식 %-포맷팅과 비슷하지만 % 대신에 {}와 : 가 추가되었다.

3. 예를 들면 %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'


인수의 속성으로 접근

>>> 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.'
>>> class Point:
...     def __init__(self, x, y):
...         self.x, self.y = x, y
...     def __str__(self):
...         return 'Point({self.x}, {self.y})'.format(self=self)
...
>>> str(Point(4, 2))
'Point(4, 2)'


인수의 항목으로 접근

>>> 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, % f를 교체 그리고 사인 지정

>>> '{:+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'


%x와 %o를 교체하고 값을 다른 베이스로 변환

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


퍼센트 표현

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


타입 지정 포맷팅

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


중첩된 인수 및 더 복잡한 예제

>>> for align, text in zip('<^>', ['left', 'center', 'right']):
...     '{0:{fill}{align}16}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> width = 5
>>> for num in range(5,12): 
...     for base in 'dXob':
...         print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')
...     print()
...
    5     5     5   101
    6     6     6   110
    7     7     7   111
    8     8    10  1000
    9     9    11  1001
   10     A    12  1010
   11     B    13  1011




:
Posted by 지훈2