본문 바로가기

프로그래밍/Python

파이썬(Python) 기초 Step 2. 문자열(String)

○ 문자열이란?

문자열은 영어로 String이라고 하며, 문자인 character의 나열을 의미합니다. 문자열은 따옴표로 감싸서 표시합니다(예시 1) 참조).  또한, 플러스( + ) 연산자를 사용하여 문자열과 문자열을 서로 결합할 수 있습니다(예시 2) 참조).

예시 1) 'string' 또는 "string"
예시 2) 'codacoding' + 'tistory' + '.com'

○ 문자열에서의 따옴표

문자열에서도 규칙이 존재합니다. 그 규칙은 크게 두 가지로 구분됩니다. 첫 번째는 따옴표입니다. 문자열을 표현하고자 할 때 문자열을 감싸주는 따옴표의 종류는 홀 따옴표와 쌍 따옴표 두 가지가 있습니다. 만약 문자열을 표현할 때 홀 따옴표를 사용하고자 할 경우에는 홀 따옴표로만, 쌍 따옴표를 사용하고자 할 경우에는 쌍 따옴표로만 입력해야 합니다(예시 3) 참조). 만약에 문자열 안에 따옴표를 넣어야 되는 상황이라면 어떻게 할까요? 이러한 경우에는 문자열을 감싸는 따옴표의 종류와 문자열에 포함될 따옴표를 서로 구분해주면 됩니다(예시 4) 참조). 또한 문자열 안에 있는 특정한 문자를 따옴표를 사용하여 구분하는 것이 아닌 백 슬래시(\)를 사용하여 구분할 수도 있습니다(예시 5) 참조). 만약 이러한 규칙을 지키지 않고 코드를 실행할 경우에는 Syntax Error(문법 오류)가 발생합니다. 

예시 3) 
올바른 경우 : 'Coda' 또는 "Coda"
잘못된 경우 : 'Coda" 또는 "Coda'
예시 4) 
올바른 경우 : "Coda는 'Coding'을 좋아합니다." 또는 'Coda는 "Coding"을 좋아합니다.'
잘못된 경우 : "Coda는 "Coding"을 좋아합니다." 또는 'Coda는 'Coding'을 좋아합니다.'
예시 5) "Coda는 Coding\"을 좋아합니다. 또는 'Coda는 Coding\'을 좋아합니다.

○ 문자열의 결합

위에서 언급했듯이 문자열과 문자열은 플러스( + ) 연산자를 사용하여 서로 결합할 수 있습니다. 또한 문자열은 숫자와도 결합할 수 있습니다. 문자열과 숫자가 결합할 때에는 먼저 숫자를 문자열로 변환해주어야 합니다. 예를 들어, age라는 변수에 25라는 값을 할당하고, 다른 문자열과 결합한다고 했을 때 "I am" + "age" + "years old."로 입력하게 되면 문법 오류가 발생됩니다. 이와 같은 경우에도 마찬가지로 변수 age이 가진 값을 문자형으로 변환해주면 이러한 문제를 해결할 수 있습니다.(예시  6) 참조). 

예시 6)
올바른 경우 : "I am" + str(age) + "years old."
잘못된 경우 : "I am" + "age" + "years old."

○ 인덱싱(Indexing)

브라켓([ ]) 문법과 인덱스를 사용하여 특정 위치의 문자 하나를 추출하는 것을 인덱싱(Indexing)이라고 합니다. 파이썬을 비롯한 대부분의 주류 프로그래밍 언어(C, C++, JAVA 등)에서는 Zero Based Index를 사용합니다. 이 말은 즉, Index의 시작이 1부터 시작하는 것이 아닌 0부터 시작하는 것을 의미합니다. 예를 들어, 문자열 CODA가 있을 때 첫 번째 문자인 C의 Index는 1이 아닌 0이되며, O는 Index 번호 1, D는 Index 번호 2, A는 Index 번호 3이 됩니다. Index 번호를 역순으로 설정한 것을 Reverse Index라고 하며 이는 반대로 가장 마지막 Index 번호가 -1부터 시작하여 첫 번째 Index 번호까지 -1씩 감소됩니다.(예시 7) 참조).

예시 7)
Index_Number 0 1 2 3
String C O D A
Reverse Index_Number -4 -3 -2 -1

이번에는 Index 번호를 사용하여 각각의 문자열의 문자를 출력해보도록 하겠습니다. Index를 사용할 때에는 브라켓([ ]) 기호 안에 Index 번호를 입력하여 해당 Index 번호에 지정된 문자를 불러올 수 있습니다. 예를 들어 CODA라는 문자열의 문자 중에서 첫 번째 문자인 'C' 를 출력하고자 한다면 Index 번호를 0으로 지정하면 됩니다. 문자열 CODA에는 Index 번호가 3까지 존재하며, 만약 Index 번호에 4를 부여하게 되면 문법 오류가 발생됩니다.(예시 8) 참조). 

예시 8)

var = 'CODA'
var[0]

→ 'C' 출력

○ 슬라이싱(Slicing)

슬라이싱은 브라켓([ ])을 사용하여 하나의 문자부터 여러 개의 문자를 추출하는 것을 말합니다. 인덱싱과 비슷하지만 인덱싱은 하나의 문자만을 출력할 수 있는 반면에 슬라이싱을 여러 개의 문자를 추출할 수 있다는 특징이 있습니다. 슬라이싱의 문법은 다음과 같습니다. 

[start : stop : step]

여기서 start는 추출하고자 하는 문자열의 첫 문자의 Index입니다. stop은 추출하고자 하는 문자열의 마지막 문자의 인덱스에서 1을 더한 값입니다. step은 start에서 stop까지의 증가 폭을 의미합니다. 여기서 step은 생략이 가능하며, step을 생략할 경우 기본 값으로 설정된 1만큼의 증가 폭이 자동으로 설정됩니다. 예를 들어, 문자열 CODA에서 C와 O만 출력하고자 할 때에는 [0 : 2 : 1 (또는 생략)]을 입력하면 됩니다(예시 9) 참조). 또한 문자열 CODA에서 C와 D만 출력하고자 할 때에는 [0 : 4 : 2]를 입력하면 Index 번호의 증가 폭이 2가 되어 C, D만 출력하게 됩니다.(예시 10) 참조). 

예시 9)

var = 'CODA'
var[0 : 2 : 1]

//또는

var[0 : 2]
예시 10)

var = 'CODA'
var = [0 : 4 : 2]

또 다른 경우에 대해서 예를 들어보겠습니다. mixed라는 변수에 문자와 숫자가 섞인 'C54D13O67A32'값을 할당하고, 문자만 출력하고자 할 때에는 [0 : 15 : 3]을 입력하면 됩니다(예시 11) 참조).

예시 11)

mixed = C54D13O67A32
mixed[0 : 15 : 3]

○ String Methods

이번에는 Built-In 클래스인 str이 제공하는 메소드에 대해서 알아보도록 하겠습니다. 파이썬 내부의 모든 것은 어떤 클래스에 오브젝트이며, 자신이 정한 클래스에 정의된 메소드를 사용할 수 있습니다. 

먼저, 한 문장을 변수에 저장하도록 하겠습니다(예시 12)의 3행 참조). 이어서 type함수를 사용하여 변수에 저장된 오브젝트의 타입을 알아보도록 하겠습니다(예시 12)의 4행 참조). 그러면 str이 저장된 것을 확인할 수 있습니다. 이어서 dir 함수를 사용하여 str 오브젝트가 어떤 메소드를 사용할 수 있는지 확인할 수 있습니다(예시 12)의 5행 참조). 또한 해당 함수에 .을 입력하여 tap키를 누르면 해당 함수가 가진 메소드의 목록을 확인할 수 있습니다(예시 12)의 6행 참조). 해당 str 오브젝트에 .capitalize()를 입력하여 첫 번째 문자를 대문자로 변환할 수 있습니다(예시 12)의 7행 참조).

예시 12)

greeting = 'welcome to Codacoding.tistory.com'
type(greeting)
dir(greeting)
greeting.
greeting.capitalize()

메소드는 예시 12)와 같이 사용할 수 있으며, str 클래스가 제공하는 메소드 중에서 많이 사용되는 8개의 메소드에 대한 설명은 다음과 같습니다.

메소드 메소드 기능 예시
upper 문자열을 대문자로 변환
exam = "exam"
exam.upper()
결과 ▷ "EXAM"
lower 문자열을 소문자로 변환
exam_upper = "EXAM"
exam_upper.lower()
결과 ▷ "exam"
capitalize 첫 문자를 대문자로 변환
exam = "exam"
exam.capitalize()
결과 ▷ "Exam"
split 문자열을 리스트 문자열로 분리
exam_split = "exam1, exam2, exam3"
exam_split.split(",")
결과 ▷"exam1exam2exam3"
join 특정 문자나 문자열로 다른 문자를 연결
comma = "."
exam = "exam"
comma.join(exam)
결과 ▷ "e.x.a.m"
strip 빈 공간(White space)을 삭제
exam_strip = "          exam           "
exam.strip.strtip()
결과 ▷ "exam"
replace 특정 문자를 다른 문자로 치환
exam_replace="exam is XXXX"
exam.replace('XXXX', 'good')
결과 ▷ "exam is good"
format 문자열 안의 place holder에 원하는 값을 대체 추가설명, 다음 단락 참조

○ String Formatting

format 메소드를 사용하면 문자열 안에 컬리브레이스(curly brace)({ })를 사용하여 여러 개의 빈 공간(Place Holder)을 정의한 뒤 원하는 값으로 다양하게 치환할 수 있습니다. 즉, 템플릿을 만들어 사용한다고 할 수 있습니다. format 메소드를 사용하려면 문자열 안에 컬리브레이스({ })를 사용하여 빈 공간을 정의합니다. 이 빈 공간을 정의하는 방법에는 세 가지가 있습니다. 첫 번째는 빈 컬리브레이스({ })를 사용하는 방법입니다. 빈 컬리브레이스를 사용하면 format 메소드에 전달되는 인자가 빈 공간에 순서대로 치환됩니다(예시 13) 참조). 

예시 13)

name = "CODA"
count = 13
"{}님 {}번 째 방문을 축하드립니다.".format(name, count)

결과 ▷ "CODA님 13번 째 방문을 축하드립니다."

이 경우에는 빈 공간과 메소드에 전달되는 인자의 갯수는 반드시 같아야 하며, 만약 갯수가 다를 경우 Index 오류가 발생됩니다. 두 번째 방법은 키워드를 사용하는 방법이 있습니다. 이 방법은 빈 공간이 많고 동일한 값을 여러 번 사용해야 하는 경우 키워드를 사용하는 것을 권장합니다(예시 14) 참조).

예시 14)

"이번 {name}는 format {name}이며, {number}번 째 {name}입니다.".format(name="예시", number = 14)

결과 ▷ "이번 예시는 format 예시이며, 14번 째 예시입니다."

마지막 방법은 Index를 사용하는 방법입니다. 이 방법은 인자의 Index를 컬리브레이스({ })안에 정의하면 됩니다(예시 15) 참조). 숫자 안에 zero padding을 표시할 수도 있습니다(예시 16) 참조). zero padding을 사용하여 소숫점 자릿수를 정의할 수도 있습니다(예시 17) 참조).

예시 15)

for i in range(1, 2) : 
     print('exam_{:03d}' .format(i))

결과 ▷ 'exam_001'
결과 ▷ 'exam_002'
예시 16)
: 0 3 d
  빈 공간을 0으로 채움 문자열의 최소 길이 Index 번호
결과 ▷ 001
예시 17)

// 소숫점을 3자리만 출력
// f는 float을 의미
'{:.3f}'.format(1.11111111}


결과 ▷ 1.111

또한 다음과 같이 문자열을 보기 좋게 정렬할 수도 있으며(예시 18) 참조), 좌측 정렬, 우측 정렬, 가운데 정렬도 할 수 있습니다(예시 19) 참조). 

예시 18)

animal = [
	{'kind_animal' : 'Dog', 'gender' : 'male', 'price' : 1000},
    {'kind_animal' : 'Cat', 'gender' : 'male', 'price' : 2000},
    {'kind_animal' : 'Mouse', 'gender' : 'female', 'price' : 3000},
]

print('{:11s} {:6s} {:5d}.format('kind_animal', 'gender', 'price'))
print('{} {} {}'.foramt('-'*11, '-'*6, '-'*5))
for animals in animal:
	print('{:11s} {:6s} {:5d}'.format(animals['kind_animal'], animals['lastname'], animals['age']))
    
결과 ▷
kind_animal gender price
----------- ------ -----
Dog         male    1000
Cat         male    2000
Mouse       fmale   3000
예시 19)

animal = [
	{'kind_animal' : 'Dog', 'gender' : 'male', 'price' : 1000},
    {'kind_animal' : 'Cat', 'gender' : 'male', 'price' : 2000},
    {'kind_animal' : 'Mouse', 'gender' : 'female', 'price' : 3000},
]

print('{:11s} {:6s} {:5d}.format('kind_animal', 'gender', 'price'))
print('{} {} {}'.foramt('-'*11, '-'*6, '-'*5))
for animals in animal:
	print('{:^11s} {:>6s} {:<5d}'.format(animals['kind_animal'], animals['lastname'], animals['age']))
    
    // 가운데 정렬 : ^, 왼쪽 정렬 : <, 오른쪽 정렬 : >
    
결과 ▷
kind_animal gender price
----------- ------ -----
    Dog     male    1000
    Cat     male    2000
   Mouse    fmale   3000