처음부터 차근차근 파이썬 자세히보기

Python-기본/Python-데이터 타입 및 자료 구조

Python-3. 시퀀스 데이터 타입(1. 문자열)

윤빵빵영 2020. 12. 20. 20:03

다음으로 파이썬 내장 시퀀스 자료형에 대해 알아봅시다. 파이썬의 내장 시퀀스 타입으로는 문자열, 튜플, 리스트가 있습니다. 파이썬 내장 시퀀스 자료형은 다음과 같은 속성을 기본적으로 갖습니다.

파이썬 내장 시퀀스 타입의 속성
1. 멤버십 연산 in
2. 크기 함수 len(seq)
3. 슬라이싱 seq[:]
4. 반복성(iterable)

우선 문자열 자료형을 다루는 방법을 정리해보고 위의 속성이 어떻게 나타나는지 알아봅시다. 

 

문자열(String)

일반적으로 프로그래머들이 숫자를 다루는 데 능숙하다고 생각하시는 분들이 많습니다. 실제로 대부분의 프로그래머들은 텍스트의 문자열(string)을 숫자보다 더 많이 다룹니다. Python 3은 유니코드(Unicode) 표준을 제공하므로 어떠한 언어든 사용이 가능합니다. 물론 한국어도 문자열로 사용이 가능합니다.  

문자열을 파이썬 시퀀스(sequence)의 첫 번째로 소개하고자 합니다. 문자열은 일련의 문자(sequence of character)를 포함하고 있고 이렇게 일련의 원소들로 만들어지는 자료형을 시퀀스 타입이라고 합니다. 시퀀스 타입은 위에서 설명했듯 공통적으로 갖고 있는 속성들이 있으며 이런 속성들을 활용하여 데이터 내에서 여러 가지 일들을 할 수 있습니다.

파이썬에서 문자열은 str로 나타내며 다른 프로그래밍 언어들과는 달리 불변형(immutable)입니다. 앞서 숫자형 자료를 소개할 때도 불변형이라 했습니다. 불변형과 가변형(mutable)에 대해서는 시퀀스 데이터 타입 중 하나인 리스트(list)를 다룰 때 설명드리도록 하겠습니다.


목차

1. 문자열 생성하기
  (1). 문자열 생성 기본
    1) 큰따옴표(""), 작은따옴표(')
    2) 따옴표 세 개 이어붙이기(""" """ 또는 ''' ''')
  (2). 문자열 안에 따옴표를 포함시킬 때
  (3). 여러 줄의 문자열 데이터 생성
2. 자료형 변환
  str(x)
  참고) 이스케이프 코드(Escape code)
3. 시퀀스 데이터 타입 속성-문자열
  (1). 멤버십 연산 in
  (2). 크기 함수 len(seq)
  (3). 슬라이싱 속성 seq[:]
  (4). 반복성(iterable)
4. 문자열 연산
  (1). 문자열 더하기(Concatenation)
  (2). 문자열 곱하기
5. 문자열 포매팅
  (1). 포맷 코드
    1) 정렬과 공백
    2) 소수점 표현하기
  (2). format() 메서드
    1) 숫자 바로 대입하기
    2) 문자열 바로 대입하기
    3) 2개 이상의 값 넣기
    4) 이름으로 넣기
    5) 인덱스와 이름을 혼용해서 넣기
    6) 왼쪽 정렬
    7) 오른쪽 정렬
    8) 가운데 정렬
    9) 공백 채우기
    10) 소수점 표현하기
    11) ‘{’ 또는 ‘}’ 문자 표현하기
  (3). f문자열 포매팅
6. 문자열 메서드
  (1) join( )
  (2) ljust( ), rjust( ), center( )
  (3) format( )
  (4) splitlines( )
  (5) split( )
  (6) strip( )
  (7) swapcase( )
  (8) index( )
  (9) find( )
  (10) count( )
  (11) replace( )
  (12) startswith( ), endswith( ), isalnum( )
  (13) capitalize( ), title( )


 

1. 문자열 생성하기

  (1). 문자열 생성 기본

    1) 큰따옴표(""), 작은따옴표(')

문자열은 기본적으로 따옴표를 이용해서 데이터를 생성합니다. 큰따옴표나 작은따옴표 안에 원하는 문자열을 넣어주면 생성할 수 있습니다.

x = "Life is short."
y = 'You need python.'
print(x)
print(y)

결과)

Life is short.
You need python.


두 개의 따옴표를 허용하는 이유는 따옴표 그 자체를 문자열 내의 요소로 사용할 수 있게 하기 위함입니다. 이는 아래의 1-(2)를 참고하시면 됩니다.


    2) 따옴표 세 개 이어붙이기(""" """ 또는 ''' ''')

따옴표 세 개를 이어붙인 뒤 사이에 원하는 문자열을 넣을 수 있습니다. 이 경우 줄바꿈(enter)을 하더라도 문자열이 유지됩니다. 그냥 큰따옴표나 작은따옴표 내에서는 줄바꿈시 문자열이 유지되지 않습니다. 따옴표를 세 개 이어붙이는 경우는 짧은 문자열보다는 여러 줄의 문자열 데이터를 만들 때 쓰는 것이 적합합니다. 

x = """Life is short
You need python."""
print(x)


y = '''My name is 윤영'''
print(y)

결과)

Life is short
You need python.
My name is 윤영


따옴표들의 위치도 중요합니다. 시작하는 따옴표 직후의 줄바꿈이나 끝 따옴표 앞의 줄바꿈은 문자열 데이터 안에 그대로 나타납니다.

x = """
Life is short

You need python.
"""

print(x)


y = '''My name is 윤영
'''

print(y)

결과)

(줄바꿈)
Life is short
You need python.
(줄바꿈)
My name is 윤영
(줄바꿈)


"""와 Life is short 사이에 줄바꿈이 있으므로 줄바꿈이 있는 채로 출력됩니다. You need python.과 """ 사이 및 My name is 윤영과 """ 사이도 마찬가지입니다. 이해를 돕기 위해 결과에 (줄바꿈)을 넣어서 표시했습니다.

빈 문자열도 있습니다. 따옴표 사이에 어떠한 문자도 없지만 그 자체로 데이터로서 존재합니다.

empty = ""
print(empty)
empty = ''
print(empty)
empty = """"""
print(empty)
empty = ''''''
print(empty)

결과)

(빈 문자열)
(빈 문자열)
(빈 문자열)
(빈 문자열)


이해를 돕기 위해 결과 내 빈 문자열을 (빈 문자열)로 표기했습니다.

 

  (2). 문자열 안에 따옴표를 포함시킬 때

따옴표 자체를 문자열에 포함시키고 싶을 때도 있을 겁니다. 기본적으로 작은따옴표를 포함시키고 싶을 때는 큰따옴표를, 큰따옴표를 포함시키고 싶을 때는 작은따옴표를 사용하면 됩니다. 큰따옴표와 작은따옴표 모두 문자열 안에 포함시키고 싶을 때는 따옴표를 세 개 이어붙인 표현을 사용하면 됩니다.

comment1 = '''Young's favorite fruit is apple'''
comment2 = "Python is 'very good' programming language"
comment3 = '현수는 "안녕"이라고 말했다'
comment4 = """현우의 '담배'에는 "금연"이라고 적혀있다."""
print(comment1)

print(comment2)
print(comment3)
print(comment4)

결과)

Young's favorite fruit is apple
Python is 'very good' programming language
현수는 "안녕"이라고 말했다
현우의 '담배'에는 "금연"이라고 적혀있다.


이스케이프(escape) 코드를 이용할 수도 있습니다. 백슬래시(\)를 이용하면 문자열 내에서 특수한 문자를 사용할 수 있으며 \와 따옴표를 결합한 이스케이프 코드(\')는 따옴표를 문자열 내에서 출력하는 역할을 합니다.

comment1 = 'Young\'s favorite fruit is apple'
comment2 = "Python is \"very good\" programming language"
print(comment1)
print(comment2)

결과)

Young's favorite fruit is apple
Python is "very good" programming language

 

  (3). 여러 줄의 문자열 데이터 생성

여러 줄의 문자열을 하나의 변수로 사용하고 싶을 때도 있을 겁니다. \n은 줄바꿈을 출력하는 이스케이프 코드입니다. 아래의 예제를 통해 \n 이스케이프 코드가 어떻게 출력되는지 확인할 수 있습니다.

long_comment = 'Life is short\nYou need python'
print(long_comment)

결과)

Life is short
You need python


앞서 설명드렸듯이, 간단하게 따옴표 세 개를 이어붙인 표현 사이에 문자열을 넣으면 여러 줄의 문자열 데이터를 생성할 수 있습니다.

long_comment = '''Life is short
You need python'''
print(long_comment)

결과)

Life is short 
You need python

 

2. 자료형 변환

  str(x)

숫자 데이터 타입 글에서 언급했듯, 파이썬 자료형을 str( ) 함수를 이용하여 문자열 자료형으로 변환할 수 있습니다.

x = 98.6
y = 1.0e4
z = True
print(str(x))
print(str(y))
print(str(z))

결과)

98.6
10000.0
True


파이썬은 print( )를 통해 문자열이 아닌 객체를 출력할 때, 또는 아래에서 다룰 포맷팅을 할 때 내부적으로 str( ) 함수를 사용합니다. 자세한 내용은 나중 글에서 다루겠습니다.

 

 

이스케이프 코드(Escape code)

이스케이프 코드는 프로그래밍할 때 사용할 수 있도록 미리 정의해 둔 "문자 조합"입니다. 주로 출력물을 보기 좋게 정렬하는 용도로 사용합니다.

코드  
\n 문자열 안에서 줄을 바꿀 때
\t 문자열 사이에 탭 간격을 줄 때
\\ 문자 \를 그대로 표현할 때
\' 작은따옴표(')를 그대로 표현할 때
\" 큰따옴표(")를 그대로 표현할 때

문자열 내의 일부 문자를 이용하여 표현하기 어려운 것들을 표현할 수 있게끔 해주는 것이 이스케이프 코드입니다. 앞서 말씀드렸듯, 백슬래시(\)를 이용하며 다음과 같이 활용할 수 있습니다.

print('\tabc')
print('a\tbc')
print('abc\t')

결과)

    abc
a    bc
abc(공백)


이해를 돕기 위해 마지막 줄의 시행 결과에 (공백)으로 표현하였습니다. 백슬래시 자체를 표현할 때는 \\를 입력하면 됩니다.

speech = 'Today we honor our friend, the backslash: \\.'
print(speech)

결과)

Today we honor our friend, the backslash: \.
 

3. 시퀀스 데이터 타입 속성-문자열

  (1). 멤버십 연산 in

'문자열' in '문자열'은 앞의 문자열이 뒤의 문자열에서 검색되는지를 확인합니다. 앞의 '문자열'과 정확히 일치하는 부분이 있다면 True를, 일치하는 부분이 없다면 False를 반환합니다. 영어의 경우 대문자와 소문자를 구분합니다.

x = 'Life is short. You need python'
print('L' in x)

print('Life' in x)
print('life' in x)
y = 'need '
print(y in x)

결과)

True
True
False
True

'L', 'Life', 'need '(띄어쓰기 주의)는 모두 'Life is short. You need python'에 정확하게 일치하는 부분이 있기 때문에 True를 반환합니다. 이를 출력함수 print()를 통해 확인할 수 있습니다. 'life'는 대소문자 구분에 의해 해당 문장과 정확히 일치하는 부분이 없으므로 False를 반환합니다. 

 

  (2). 크기 함수 len(seq)

크기 함수 len(seq)는 문자열의 길이를 정수로 반환합니다. 말 그대로 글자수를 정수형 데이터 타입으로 반환합니다.

x = 'Life is short. You need python'
print(len(x))
y = '안녕하세요'
print(len(y))

결과)

30
5

 

  (3). 슬라이싱 속성 seq[:]

시퀀스 타입의 자료형은 인덱싱 및 슬라이싱이 가능합니다. 즉 해당 자료 내에서 특정 위치 및 영역의 값을 조회하거나 다룰 수 있습니다. 'python'이란 문자에 대해 살펴보겠습니다.

파이썬은 0부터 숫자를 셉니다. 'python'에서 각 알파벳은 위의 빨간색으로 표기된 숫자에 위치합니다. 해당 위치의 알파벳을 불러오기 위해서는 대괄호 [ ]를 사용합니다.

x = 'python'
print(x[0])

결과)

p


이렇게 문자열 변수 seq 내에서 특정 위치의 문자를 대괄호 [ ]와 해당 위치의 정수를 이용하여 뽑아내는 것을 추출(extraction)이라 합니다. 위의 코드는 문자열 x의 0의 위치에 해당하는 값을 출력하는 코드입니다. 이때 0을 인덱스라 하며 0의 위치에 해당하는 값(알파벳)은 p이므로 문자열 p가 출력되는 것입니다.

x = 'python'
print(x[2])
print(x[-1])

결과)

t
n

x[2]는 문자열 'python'의 2의 위치에 해당하는 값을 가리킵니다. 인덱스에서 음수는 다음과 같은 의미를 가집니다.

즉 x[-1]은 문자열 뒤에서부터 접근할 때 첫 번째 위치를 가리킵니다. 문자열 'python'의 경우 인덱스 [5]와 [-1]은 동일한 값을 가리킵니다.

문자열의 길이보다 더 큰 위치를 입력하면 IndexError 예외를 얻게 됩니다.

letters = 'abcdefghijklmnopqrstuvwxyz'
print(letters[100])

결과)

IndexError: string index out of range


글의 제일 앞에서 문자열은 불변형 자료라고 언급을 했습니다. 따라서 할당된 문자열 변수에 다른 문자를 추가하거나 문자열 내의 어떤 문자를 다른 문자로 바꾸는 것은 허용되지 않습니다. 'Henny'라는 문자열을 'Penny'로 바꾸기 위해서 다음과 같은 소스 코드를 생각할 수 있지만 실제로는 실행되지 않습니다.

name = 'Henny'
name[0] = 'P'
print(name)

결과)

    name[0] = 'P'
TypeError: 'str' object does not support item assignment


대신 문자열 자료형에서 제공하는 메서드를 활용하거나 아래의 슬라이싱 방법을 이용할 수 있습니다.

name = 'Henny'
print(name.replace('H', 'P'))
print(name)
print('P' + name[1:])

결과)

Penny
Henny
Penny


문자열은 불변형이기 때문에 name.replace( )를 실행하더라도 변수 name의 문자열이 변경되지는 않습니다. 메서드의 결과를 출력할 뿐입니다. 이제 소스 코드 내 name[1:]로 표기된 문자열 슬라이싱에 대해서 다뤄봅시다.


문자열 슬라이싱은 문자열에서 한 문자만이 아닌 인덱스 위치에 걸친 부분을 뽑아내며 [시작 인덱스:끝 인덱스]와 같이 콜론(colon, :)을 이용합니다. 이때 끝 인덱스에 위치한 값은 뽑아내지 않습니다. 슬라이싱은 시퀀스 타입 자료에 모두 적용 가능한 특성으로 아래와 같이 활용됩니다.

    [:] - 시퀀스의 처음부터 끝까지를 추출합니다.
    [start:] - 시퀀스의 start에서 끝까지를 추출합니다.
    [:end] - 시퀀스의 처음부터 end - 1까지 추출합니다.
    [start:end] - 시퀀스의 start에서 end - 1까지 추출합니다.
    [start:end:step] - 시퀀스의 start에서 end - 1까지, step만큼 건너뛰면서 추출합니다.

x = 'Life is short. You need python'
print(x[0:4])
print(x[0:3])

결과)

Life
Lif

x[0]은 'L'을, x[4]는 e 뒤의 빈칸 ' '을 가리킵니다. 실제로 'e'를 뽑아내기 위해서는 x[3]과 같이 3의 인덱스가 필요합니다. 그러나 주의해야할 것은 시퀀스 타입의 데이터 슬라이싱에서 끝 인덱스 직전의 인덱스까지만 부분 데이터를 뽑아낸다는 것입니다. 여러 슬라이싱을 테스트 하면서 익히시기를 바랍니다.

일정 간격을 주고 슬라이싱을 하는 경우 [시작 인덱스:끝 인덱스:간격]의 형식으로 시퀀스 자료형 슬라이싱이 가능합니다.

x = 'Life is short. You need python'
print(x[0:-1:2])

결과)

Lf ssot o edpto


다음은 여러 가지 예제들입니다.

letters = 'abcdefghijklmnopqrstuvwxyz'
print(letters[:])
print(letters[20:])
print(letters[10:])
print(letters[12:15])
print(letters[-3:])
print(letters[18:-3])
print(letters[-6:-2])
print(letters[::7])
print(letters[4:20:3])
print(letters[19::4])
print(letters[:21:5])
print(letters[-1::-1])
print(letters[::-1])

결과)

abcdefghijklmnopqrstuvwxyz
uvwxyz
klmnopqrstuvwxyz
mno
xyz
stuvw
uvwx
ahov
ehknqt
tx
afkpu
zyxwvutsrqponmlkjihgfedcba
zyxwvutsrqponmlkjihgfedcba


추출(extraction)과 달리 슬라이싱에서 문자열의 처음보다 더 앞선 위치는 0으로, 끝보다 더 뒤의 위치는 -1로 취급됩니다.

letters = 'abcdefghijklmnopqrstuvwxyz'
print(letters[-50:])
print(letters[-51:-50])
print(letters[:70])
print(letters[70:71])

결과)

abcdefghijklmnopqrstuvwxyz
(빈 문자열)
abcdefghijklmnopqrstuvwxyz
(빈 문자열)

 

  (4). 반복성(iterable)

파이썬에는 for이나 while과 같은 구문을 이용한 반복 처리가 가능합니다. 시퀀스 타입의 데이터는 for in 반복문 형식을 통해 문자열을 구성하는 값을 하나씩 차례대로 꺼내어 다룰 수 있습니다.

x = '안녕하세요'
for i in x:

    print(i)

위의 코드는 문자열 x를 구성하는 값 i에 대해 차례대로 그 값을 출력하는 코드입니다. 결과는 다음과 같습니다.

결과)





이와 같이 문자열은 시퀀스 타입의 데이터이므로 이 타입의 데이터가 갖는 네 가지 속성을 사용할 수 있습니다. 

 

4. 문자열 연산

  (1). 문자열 더하기(Concatenation)

문자열 그 자체, 또는 문자열 변수를 덧셈 연산(+)을 통해 연결하여 이어 붙일 수 있습니다.

a = "Python"
b = " is fun!"
print(a + b)

결과)

Python is fun!


덧셈 기호 없이 문자열을 그대로 이어 붙여서 만들 수도 있습니다.

x = 'Life is short. ' 'You need python'
print(x)

결과)

Life is short. You need python


파이썬은 기본적으로 문자열을 이어붙일 때 공백을 추가하지 않습니다. print( ) 함수의 인자로서 출력될 때는 공백이 자동으로 추가됩니다.

a = 'Duck.'
b = a
c = 'Grey Duck!'
print(a + b + c)

결과)

Duck.Duck.Grey Duck!

 

a = 'Duck.'
b = a
c = 'Grey Duck!'
print(a, b, c)

결과)

Duck. Duck. Grey Duck!

 

  (2). 문자열 곱하기

문자열과 정수를 곱연산(*)할 수 있습니다. 이때 양수를 곱하면 해당 숫자만큼 반복된 문자열을 반환합니다. 음수를 곱하면 빈 문자열을 반환합니다.

a = "Ha"
print(a * 3)

결과)

HaHaHa


좀 더 복잡한 형태도 가능합니다.

start = 'Na ' * 4 + '\n'
middle = 'Hey' * 3 + '\n'
end = 'Goodbye.'
print(start + start + middle + end)

결과)

Na Na Na Na 
Na Na Na Na 
HeyHeyHey
Goodbye.

 

5. 문자열 포매팅

문자열을 출력하는 과정은 소스 코드 내에서 자주 일어나는 일입니다. 때문에 같은 문장 구조를 갖지만 어떤 부분만 다른 문장을 반복해야 되는 일도 자주 일어납니다. 예를 들어 기상청에서 기온 자료를 받아 출력하는 프로그램을 생각해봅니다. 오늘 평균 기온이 섭씨 23도라 하면

'오늘 평균 기온은 섭씨 23도 입니다.'

와 같은 결과를 출력합니다. 다음날에는 평균 기온이 조금 떨어져 섭씨 21도가 되었습니다. 따라서

'오늘 평균 기온은 섭씨 21도 입니다.'

를 출력합니다. 이 경우 문장의 구조는 완벽히 동일하며 평균 기온에 해당되는 값만 달라집니다. 이때 해당되는 값을 변수로 지정하여 그 부분만 치환하여 출력할 수 있다면 짧은 소스 코드로 반복 없이 프로그래밍을 할 수 있게 될 겁니다. 이를 가능하게 하는 것이 문자열 포매팅입니다.

아래의 예를 봅시다.

print("오늘 평균 기온은 섭씨 %d도 입니다." % 23)
number = 21
print("오늘 평균 기온은 섭씨 %d도 입니다." % number)

예시의 문자열을 보면 다음과 같이 되어 있습니다.

"오늘 평균 기온은 섭씨 %d도 입니다."

이때 %는 해당 부분이 포맷 코드임을 의미하며 d는 포맷 코드에 대입하는 자료형이 정수임을 의미합니다. 즉, %d는 이 부분에 정수형 값을 치환하여 넣겠다는 의미입니다. 그리고 해당 정수는

"오늘 평균 기온은 섭씨 %d도 입니다." % 23

과 같이 문자열 종료 이후 '% 값'의 형태로 입력하게 됩니다. 결과는 아래와 같습니다.

결과)

오늘 평균 기온은 섭씨 23도 입니다.
오늘 평균 기온은 섭씨 21도 입니다.

 

정수형 데이터가 아닌 문자열 바로 대입할 경우에는 %s 포맷 코드를 이용합니다.

print("나는 오늘 %s개의 사과를 먹었다." % "다섯")

결과)

나는 오늘 다섯개의 사과를 먹었다.

 

반복되는 문장 구조 내 대입하고자 하는 값이 2 이상일 경우도 있습니다. 아래와 같은 형식으로 출력할 수 있습니다.

number = 10
day = "three"
print("I ate %d apples, so I was sick for %s days." % (number, day))

결과)

I ate 10 apples, so I was sick for three days.

이제 문자열 포매팅을 하는 세 가지 방식에 대해서 자세하게 다뤄봅시다. 

 

  (1). 포맷 코드

%s: 문자열(string)

%c: 문자 1(character)

%d: 정수(integer)

%f: 부동소수(floating-point)

%o: 8진수

%x: 16진수

%%: 문자 % 자체

 

문자열 내에 대입하고자 하는 자료형에 따라 다른 포맷 코드를 가져갑니다. 이때 문자 % 자체를 문장열 안에 포함시키고자 한다면 %% 포맷 코드를 이용해야 합니다. 아래와 같은 소스 코드는 오류를 발생시킵니다.

print("오차가 %d% 입니다." % 98)

결과)

TypeError: not enough arguments for format string

따라서 % 문자를 출력하고자 하는 부분을 %%로 고쳐주어야 합니다.

print("오차가 %d%% 입니다." % 98)

결과)

오차가 98% 입니다.

 

    1) 정렬과 공백

포맷 코드에 숫자를 입력하여 공백을 만들거나 문자열 정렬을 할 수 있습니다. 아래 코드의 %10s는 대입하고자 하는 문자열을 포함하여 길이가 10이 되도록 공백을 좌측에 추가합니다. %-10s는 대입하고자 하는 문자열을 포함하여 길이가 10이 되도록 공백을 우측에 추가합니다.

print("%10s" % "안녕")
print
("%-10s 현수" % "안녕")

결과)

        안녕
안녕         현수

 

    2) 소수점 표현하기

소수점 자릿수를 제한하여 표현하고자 할 때는 위와 같이 정수가 아닌 0과 1 사이의 소수를 입력합니다. 이때 정수 부분이 0이 아니라면 전체 문자열의 길이가 해당 숫자가 되도록 위와 같이 공백을 추가합니다.

print("%0.4f" % 3.141592)
print("%10.4f" % 3.141592)

결과)

3.1416
    3.1416

 

  (2). format() 메서드

메서드란 하나의 클래스(class) 내에서 사용 가능한 작동(operation)의 모음이라고 생각하시면 됩니다. 문자열이라는 자료형 내에서 사용할 수 있는 작동(또는 함수)에는 여러 가지가 있으며 그 중에 하나가 format() 메서드입니다. 메서드를 이용할 때는 해당 자료형 끝에 .format()과 같이 이어 붙여서 메서드를 사용합니다.

문자열의 format() 메서드를 사용하면 발전된 스타일로 문자열 포맷을 지정할 있습니다.

 

    1) 숫자 바로 대입하기

print("I ate {} apples".format(3))
print("I ate {0} apples".format(3))
number = 3
print("I ate {} apples".format(number))

파이썬 3.1부터 필드(field) 이름이나 인덱스를 생략할 수 있습니다. 즉, 포매팅 개수가 여러 개일때 파이썬 3.1 미만의 경우 {0}, {1}, {2}, ... 이런식으로 포매팅 인덱스를 설정해 주었는데 파이썬 3.1부터는 {}, {}, {}, ...와 같이 사용해도 무방합니다. 다만 이런 경우 하위 버전과의 호환성을 위해서 일반적으로 {0}, {1}, {2}, ...와 같이 인덱싱을 해주는 것이 좋기는 합니다.

결과)

I ate 3 apples
I ate 3 apples
I ate 3 apples

 

    2) 문자열 바로 대입하기

같은 방식으로 format() 메서드를 이용하여 문자열을 바로 대입할 수 있습니다.

print("I ate {0} apples".format("five"))
print("I ate {} apples".format("five"))

결과)

I ate five apples
I ate five apples

 

    3) 2 이상의 넣기

number = 10
day = "three"
print("I ate {0} apples, so I was sick for {1} days.".format(number, day))
print("I ate {} apples, so I was sick for {} days.".format(number, day))

결과)

I ate 10 apples, so I was sick for three days.
I ate 10 apples, so I was sick for three days.

 

    4) 이름으로 넣기

print("I ate {number} apples, so I was sick for {day} days.".format(number=10, day="three"))

결과)

I ate 10 apples, so I was sick for three days.

 

    5) 인덱스와 이름을 혼용해서 넣기

print("I ate {0} apples, so I was sick for {day} days.".format(10, day=3))

결과)

I ate 10 apples, so I was sick for 3 days.

 

    6) 왼쪽 정렬

:<10 표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 자릿수를 10으로 맞출 있습니다.

print("{0:<10}".format("hi"))
print("{:<5}".format("hi"))

결과)

'hi         '
'hi   '

표현되는 문자 hi의 우측에 공백이 있다는 것을 보여주이 위해 작은 따옴표를 붙여두었습니다.

 

    7) 오른쪽 정렬

print("{0:>10}".format("hi"))
print("{:>5}".format("hi"))

결과)

        hi
   hi

 

    8) 가운데 정렬

print("{0:^10}".format("hi"))
print("{:^5}".format("hi"))

결과)

'    hi     '
' hi  '

표현되는 문자 hi의 우측에 공백이 있다는 것을 보여주이 위해 작은 따옴표를 붙여두었습니다.

 

    9) 공백 채우기

print("{0:=^10}".format("hi"))
print("{:!<5}".format("hi"))

결과)

====hi====
hi!!!

 

    10) 소수점 표현하기

a = 3.141592
print("{0:0.4f}".format(a))
print("{:10.4f}".format(a))

결과)

3.1416
    3.1416

 

    11) ‘{’ 또는 ‘}’ 문자 표현하기

format 함수를 사용해 문자열 포매팅을 경우 ‘{’, ‘}’ 같은 중괄호(brace) 문자를 포매팅 문자가 아닌 그대로 사용하고 싶은 경우에는 아래 예시의 {{ }} 처럼 2개를 연속해서 사용하면 됩니다.

print("{{ and }}".format())

결과)

{ and }

 

  (3). f문자열 포매팅

파이썬 3.6 버전부터는 f 문자열 포매팅 기능을 사용할 있습니다. 다음 예제와 같이 문자열 앞에 접두사 f를 붙이면 사용할 수 있습니다. 기존의 %나 format() 메서드 방식에 비해 간결하고 직관적이며 속도도 빠르다는 장점이 있습니다.

name = "윤영"
age = 29
print(f'나의 이름은 {name}입니다. 나이는 {age}입니다.')

결과)

나의 이름은 윤영입니다. 나이는 29입니다.

 

f 문자열은 표현식을 지원하기 때문에 다음과 같은 것도 가능합니다.

name = "윤영"
age = 29
print(f'나의 이름은 {name}입니다. 내년에 내 나이는 {age + 1}입니다.')

결과)

나의 이름은 윤영입니다. 내년에 내 나이는 30입니다.

 

정렬은 다음과 같이 있다.

pi = 3.141592
print(f'{pi:0.4f}')
print(f'{pi:10.4f}')

결과)

3.1416
    3.1416

 

f 문자열에서 ‘{’, ‘}’ 문자를 사용하려면 다음과 같이 개를 동시에 사용해야 한다.

print(f'{{and}}')

결과)

{and}

 

6. 문자열 메서드

join( ), ljust( ), rjust( ), center( ), format( ), splitlines( ), split( ), strip( ), swapcase( ), upper( ),
lower( ),
index( ), find( ), cound( ),  replace( ), startswith( ), endswith( ), isalnum( ), capitalize( ),
title( )

메서드는 해당 데이터 타입 바로 뒤에 .method( )의 형태로 사용되는 기능으로 데이터 타입에 대해 정의되는 함수입니다. 자세한 내용은 나중에 클래스(class) 부분에서 다루겠습니다.

  (1) join( )

A.join(B): 리스트 B 있는 모든 문자열을 하나의 단일 문자열 A 결합합니다.

리스트는 파이썬 내장 자료형의 다른 한 종류로 뒤에서 다룰 예정입니다. 리스트 자료형을 만들기 위해서는 대괄호 [ ]를 사용하며 comma(,)를 이용하여 초기에 값을 리스트 내에 추가합니다. 리스트 내에 넣을 수 있는 자료형으로는 리스트를 포함한 파이썬 내장 자료형 어떤 것이 와도 괜찮습니다. 다음의 join( ) 메서드는 리스트 내의 자료형이 모두 문자열일 경우에 적용한 것입니다.

word_list = ["Python", "is", "fun"]
print("".join(word_list))
print(" ".join(word_list))
name_list = ["김현수", "전영근"]
print(" and ".join(name_list))

결과)

Pythonisfun
Python is fun
김현수 and 전영근

 

내장 함수 reversed( ) 메서드를 같이 사용할 수도 있습니다.

name_list = ["전현우", "명경규"]
print(" and ".join(reversed(name_list)))

결과)

명경규 and 전현우


join( ) 메서드는 (5)의 split( ) 메서드와 정 반대의 기능을 합니다.

 

  (2) ljust( ), rjust( ), center( )

A.ljust(width, fillchar): 문자열 A를  처음에 위치하도록 한 뒤 문자열을 포함한 길이 width만큼 문자 fillchar 채웁니다.
A.rjust(width, fillchar): 문자열 A를  마지막에 위치하도록 한 뒤 문자열을 포함한 길이 width만큼 문자 fillchar 채웁니다.
A.center(width, fillchar): 문자열 A를 가운데에 위치하도록 한 뒤 문자열을 포함한 길이 width만큼 문자 fillchar 채웁니다.

name = "윤영"
print(name.ljust(50, '-'))
print(name.rjust(50, '-'))
print(name.center(50, '-'))

결과)

윤영------------------------------------------------
------------------------------------------------윤영
------------------------윤영------------------------

 

  (3) format( )

A.format( ): 문자열 A 변수를 추가하거나 형식화하는 사용합니다.

print("{} {} {}".format("Python", "Data Structure", "Algorithm")) 
print("이름: {who}, 나이: {age}".format(who="김현수", age=28)) 
print("이름: {who}, 나이: {}".format(30, who="전영근"))

결과)

Python Data Structure Algorithm
이름: 김현수, 나이: 28
이름: 전영근, 나이: 30

 

  (4) splitlines( )

A.splitlines( ): 문자열 A 대해 바꿈 문자를 기준으로 분리한 결과를 문자열 리스트로 반환합니다.

title = "로미오\n줄리엣"
print(title.splitlines())

결과)

['로미오', '줄리엣']

 

  (5) split( )

A.split(t, n): 문자열 A에서 문자열 t 기준으로 정수 n번만큼 분리한 문자열 리스트를 반환합니다. 이때 문자열 t를 분리자(separator)라고도 합니다. 분리자를 기준으로 문자열을 쪼개서 리스트의 원소로 삼아 새로운 리스트를 만듭니다. 리스트는 다음 글에서 다루도록 하겠습니다. 간단히 말해 원소의 순서가 있는 배열이라고 생각하시면 편합니다.

data = "20200512;국어;3시간;챕터2"
print(data.split(";", 1))
print(data.split(";", 2))
print(data.split(";"))

결과)

['20200512', '국어;3시간;챕터2']
['20200512', '국어', '3시간;챕터2']
['20200512', '국어', '3시간', '챕터2']


split( ) 메서드 내에 아무런 인자를 대입하지 않는다면 공백을 기준으로 문자열을 분리합니다.

data = "get gloves,get mask,give cat vitamins,call ambulance"
print(data.split())

결과)

['get', 'gloves,get', 'mask,give', 'cat', 'vitamins,call', 'ambulance']


이와
비슷하게 rsplit(t, n) 메서드는 split(t, n) 메서드와 같은 방식으로 문자열을 오른쪽에서 왼쪽으로 분리한 문자열 리스트를 반환합니다.

data = "20200512;국어;3시간;챕터2"
print(data.rsplit(";", 1))
print(data.rsplit(";", 2))
print(data.rsplit(";"))

결과)

['20200512;국어;3시간', '챕터2']
['20200512;국어', '3시간', '챕터2']
['20200512', '국어', '3시간', '챕터2']

 

  (6) strip( )

A.strip(B): 문자열 A 앞뒤의 문자열 B 제거합니다.

mistype = "로미오 & 줄리엣999"
print(mistype.strip("999"))

결과)

로미오 & 줄리엣


strip()
메서드와 비슷한 것으로 lstrip(), rstrip() 메서드가 있습니다. A.lstrip(chars) 문자열 A 시작(왼쪽) 부분에 있는 문자열 chars 또는 공백을 제거합니다. A.rstrip(chars) 메서드도 마찬가지로 문자열 A (오른쪽) 부분에 있는 chars 또는 공백을 제거합니다.

mistype = "999로미오 & 줄리엣999"
print(mistype.lstrip("999"))
print(mistype.rstrip("999"))

결과)

로미오 & 줄리엣999
999로미오 & 줄리엣

 

  (7) swapcase( )

A.swapcase( ): 문자열 A에서 대소문자를 반전한 문자열의 복사본을 반환합니다.

title = "bUFFY and fAITH"
print(title.swapcase())

결과)

Buffy AND Faith

 

또한 capitalize() 메서드는 문자열 글자를 대문자로, lower() 메서드는 전체 문자열을 소문자로, upper() 메서드는 전체 문자열을 대문자로 변경한 문자열의 복사본을 반환합니다.

title = "bUFFY and fAITH"
print(title.capitalize())
print(title.lower())
print(title.upper())

결과)

Buffy and faith
buffy and faith
BUFFY AND FAITH

 

  (8) index( )

A.index(sub, start, end): 문자열 A에서 부분 문자열 sub 인덱스 위치를 반환하며 실패시 Value Error 예외를 발생합니다.

인덱스 start end 문자열 범위를 나타내며 생략할 경우 전체 문자열에서 부분 문자열 sub 찾습니다.

title = "Buffy and Faith"
print(title.index("y"))
print(title.index("f"))
print(title.index("a", 7))
print(title.index("a", 3, 8))
print(title.index("z"))

결과)

4
2
11
6
ValueError: substring not found

rindex(sub, start, end) 메서드는 문자열의 (오른쪽)에서부터 일치하는 부분 문자열 sub 인덱스를 반환합니다.

 

  (9) find( )

A.find(sub, start, end): 문자열 A에서 부분 문자열 sub 인덱스 위치를 반환하며, 실패하면 -1 반환합니다.

title = "Buffy and Faith"
print(title.find("y"))
print(title.find("f"))
print(title.find("a", 7))
print(title.find("a", 3, 8))
print(title.find("z"))

결과)

4
2
11
6
-1

rfind(sub, start, end) 메서드도 문자열의 (오른쪽)에서부터 일치하는 부분 문자열 sub 인덱스를 반환합니다.

 

  (10) count( )

A.count(sub, start, end): 문자열 A에서 인덱스 start, end 범위 내의 부분 문자열 sub 나온 횟수를 반환합니다.

sentence = "Life is short. You need python"
print(sentence.count("n"))
print(sentence.count("n", 0, -1))

결과)

2
1

 

  (11) replace( )

A.replace(old, new, maxreplace): 문자열 A에서 문자열 old 대체 문자열 new maxreplace만큼 변경합니다. maxreplace 지정하지 않으면, 모든 old new 변경합니다.

sentence = "Python is Python is Python"
print(sentence.replace("Python", "Computer", 2))
print(sentence.replace("Python", "Computer"))

결과)

Computer is Computer is Python
Computer is Computer is Computer

 

  (12) startswith( ), endswith( ), isalnum( )

A.startswith(t): 문자열 A가 문자열 t로 시작하는지를 판단합니다. 맞을 경우 True, 아닐 경우 False를 반환합니다.
A.endswith(t): 문자열 A가 문자열 t로 끝나는지를 판단합니다. 맞을 경 True, 아닐 경우 False를 반환합니다.
A.isalnum( ): 문자열 A가 문자나 숫자로만 구성되어 있는지를 판단합니다. 맞을 경 True, 아닐 경우 False를 반환합니다.

poem = '''All that doth flow we cannot liquid name
Or else would fire and water be the same;
But that is liquid which is moist and wet
Fire that property can never get.
Then 'tis not cold that doth the fire put out
But 'tis the wet that makes it die, no doubt.'''
name = "Python3"
print(poem.startswith('All'))
print(poem.endswith('That\'s all, folks!'))
print(poem.isalnum())
print(name.isalnum())

결과)

True
False
False
True

 

  (13) capitalize( ), title( )

A.capitalize( ): 문자열 A의 첫 번째 글자를 대문자로 변환하여 반환합니다.
A.title( ): 문자열 A의 모든 단어의 첫 번째 글자를 대문자료 변환하여 반환합니다.

setup = 'a duck goes into a bar...'
print(setup.capitalize())
print(setup.title())

결과)

A duck goes into a bar...
A Duck Goes Into A Bar...