2) 문자열 (1)

문자열이란 문장을 뜻한다. 예를 들어 다음과 같은 것들이 문자열이다.

"Life is too short, You need Python"  
"a"  
"123"

위의 예를 보면 이중 인용부호(")로 둘러싸인 것은 모두다 문자열이 되는 것을 알 수 있다. "123"은 숫자인데 왜 문자열인가? 라는 의문이 든다면, 인용부호(")로 둘러싸인 것은 모두 문자열이라고 생각하면 될 것이다.

 

문자열 만드는 방법 4가지

위의 예에서는 문자열을 만들 때 이중인용부호(")만을 사용했지만 이 외에도 문자열을 만드는 방법은 세 가지가 더 있다. 파이썬에서 문자열을 만드는 방법은 다음과 같이 네 가지로 구분된다.

"Hello World"  
'Python is fun'  
"""Life is too short, You need python"""  
'''Life is too shor, You need python'''

문자열을 만들기 위해서는 위의 예에서 보듯이,

1) 이중 인용부호(")로 문자열의 양쪽을 둘러싸거나

2) 단일 인용부호(') 또는 이중 인용부호나 단일 인용부호 세 개를 연속으로 쓰는("""''')를 양쪽으로 둘러싸면 된다.

그렇다면 왜 단순함을 좋아하는 파이썬에서 이렇듯 다양한 문자열 만드는 방법을 가지게 되었을까?

그 이유에 대해서 알아보도록 하자.

문자열 내에 (') 또는 (") 을 포함시키고 싶을 때

문자열을 만들어주는 주인공은 (') 와 (")이다.

하지만 문자열 내에 (') 와 (")를 포함시켜야 할 경우가 있다.

이 때는 좀 더 특별한 기술이 필요하다.

예제를 하나씩 살펴보면서 원리를 익혀보도록 하자.

예 1) 단일 인용부호(')를 포함시키고 싶을 때

Python's favorite food is perl

예 1과 같은 문자열을 변수에 저장하고 싶다고 가정해보자.

Python's에서 보듯이 단일인용부호(')가 포함되어 있다.

이럴 때는 다음과 같이 문자열을 이중 인용부호(")로 둘러싸야 한다.

이중 인용부호(")안에 들어 있는 단일 인용부호(')는 문자열을 나타내기 위한 기호로 인식되지 않는다.

 

>>> food = "Python's favorite food is perl"

 

시험삼아 다음과 같이 (")이 아닌 (')로 문자열을 둘러싼 뒤 실행시켜 보자. 'Python' 이 문자열로 인식되어 에러(Syntax Error)가 날 것이다.

 

>>> food = 'Python's favorite food is perl'

 

예 2) 이중 인용부호(")를 포함시키고 싶을 때

 

"Python is very easy." he says.

 

예 2와 같이 이중 인용부호(")가 포함된 문자열이라면 어떻게 해야 (") 이 제대로 표현될까?
다음과 같이 그 문자열을 단일인용부호(')로 둘러싸면 된다.

 

>>> say = '"Python is very easy." he says.'

 

이렇게 단일인용 부호(')안에 사용된 이중인용부호(")는 문자열을 나타내는 기호로 인식되지 않는다.

예 3) \ (역슬래시)로 (')과 (")를 문자열에 포함시키기

 

>>> food = 'Python\'s favorite food is perl'
>>> say = "\"Python is very easy.\" he says."

 

(')나 (")를 문자열에 포함시킬 수 있는 또 다른 방법은 '\'(역슬래시)를 이용하는 것이다.

즉 (\') 가 문자열 내에 삽입되면 그것은 문자열을 둘러싸는 기호의 의미가 아니라 문자 (') 그 자체를 뜻하게 된다.

(\") 역시 마찬가지이다. 어떤 것을 사용할 것인지는 각자의 선택이다.

대화형 인터프리터를 실행시킨 뒤 위의 예를 꼭 직접 실행해 보도록 하자.

여러 줄 짜리 문자열 처리

문자열이 항상 한 줄 짜리만 있는 것은 아니다.

다음과 같이 여러 줄 짜리 문자열이 있을 때는 어떻게 처리해야 할까?

 

Life is too short  
You need python

 

이러한 문자열을 변수에 대입하려면 어떻게 하겠는가?

예1) 줄바꿈 문자인 '\n' 삽입

 

>>> multiline = "Life is too short\nYou need python"

 

위의 예처럼 줄바꿈 문자인 '\n'을 삽입하는 방법이 있지만 읽기에 너무 불편하고 너무 줄이 길어지는 단점이 있다. 이것을 극복하기 위해 파이썬에서는 다음과 같이 (""")를 이용한다.

예 2) 연속된 이중인용부호 세 개(""") 이용

 

multiline="""
Life is too short
You need python
"""

 

위 예에서도 확인할 수 있듯이 문자열이 여러줄일 경우 위와같은 방식이 상당히 유리하고 깔끔하다는 것을 알 수 있을 것이다.

 

[참고] 이스케이프 코드

여러 줄 짜리 문장을 처리할 때 '\n'과 같은 역슬래시 문자를 이용한 이스케이프 코드를 사용했다. 이와 같은 문자를 이스케이프 코드라고 부르는데, 출력물을 보기 좋게 정렬하거나 그 외 특별한 용도로 자주이용된다. 몇 가지 이스케이프 코드를 정리하면 다음과 같다.

코드 설명
\n 개행 (줄바꿈)
\v 수직 탭
\t 수평 탭
\r 캐리지 리턴
\f 폼 피드
\a 벨 소리
\b 백 스페이스
\000 널문자
\\ 문자 "\"
\' 단일 인용부호(')
\" 이중 인용부호(")

 

 

이중에서 활용빈도가 높은 것은 \n\t\\\'\"이다. 나머지는 대부분의 프로그램에서 잘 쓰이지 않는다.

 

문자열 연산

 

파이썬에서는 문자열을 더하고 곱할 수 있다.

이것은 다른 언어에서는 쉽게 찾아 볼 수 없는 재미있는 기능이다.

우리의 생각을 그대로 반영해주는 파이썬만의 장점이라고 할 수 있다.

문자열을 더하거나 곱하는 방법에 대해 알아보기로 하자.

 

예 1) 문자열 합치기(Concatenation)

 

>>> head = "Python"
>>> tail = " is fun!"
>>> head + tail
'Python is fun!'

 

예 1의 세번 째 라인을 보자. 복잡하게 생각하지 말고 눈에 보이는 대로 생각해보자.

“Python"이라는 head변수와 " is fun"이라는 tail변수를 더한 것이다. 결과는 ‘Python is fun!’이다.

즉, head와 tail변수가 "+"에 의해 합쳐진 것이다.

직접 실행해보고 결과값이 제시한 것과 똑같이 나오는 지 확인해보자.

 

예 2) 문자열 곱하기

 

>>> a = "python"
>>> a * 2
'pythonpython'

 

여기도 마찬가지로 *의 의미는 숫자 곱하기의 의미와는 다르게 사용되었다.

여기서 사용된 *는 문자열의 반복을 뜻하는 의미로 사용되었다.

굳이 예를 설명할 필요가 없을 정도로 직관적이다.

 a * 2라는 문장은 a를 두번 반복하라는 뜻이다.

문자열 곱하기를 좀 더 응용해보자. 다음과 같은 소스를 에디터로 작성해 실행시켜보자.

 

# multistring.py

print("=" * 50)
print("My Program")
print("=" * 50)

결과값은 다음과 같이 나타날 것이다.

 

==================================================  
My Program  
==================================================

 

위와 같은 표현은 자주 사용하게 된다.

프로그램을 만들고 실행시켰을 때 출력되는 화면 제일 상단에 프로그램 제목으로 위처럼 만들면 보기 좋지 않겠는가?

 

인덱싱과 슬라이싱

 

인덱싱(indexing)이란 무엇인가를 ‘가리킨다’는 의미이고, 슬라이싱(slicing)은 무엇인가를 ‘잘라낸다’라는 의미이다.

이것들을 생각하면서 다음의 예를 따라해 보도록 하자.

 

>>> a = "Life is too short, You need Python"

 

각 문자열의 문자마다 번호를 매겨 보았다.

 

Life is too short, You need Python
0         1         2         3 
0123456789012345678901234567890123

 

즉 "Life is too short, You need Python"이라는 문자열에서 'L'은 첫 번째 자리를 뜻하는 숫자인 0을 바로 다음인 'i'는 1을 이런식으로 계속 번호를 붙인 것이다.

중간쯤에 있는 "short"의 s는 12라는 번호가 된다.

그리고 다음 예를 실행해 보자.

 

>>> a = "Life is too short, You need Python"
>>> a[3]
'e'

 

a[3] 이 뜻하는 것은 a라는 문자열의 네 번째 문자인 'e'를 말한다.

프로그래밍을 처음 접하는 독자라면 a[3]에서 3이란 숫자는 세 번째인데 왜 네 번째 문자를 말한다는 것인지 의아할 것이다.

 

"파이썬은 0부터 숫자를 센다"

 

위의 문자열을 파이썬은 이렇게 바라보고 있는 것이다.

 

a[0]: 'L', a[1]: 'i', a[2]: 'f', a[3]: 'e', a[4]: ' ',....

 

0부터 숫자를 센다는 것이 처음에는 익숙하지 않겠지만 이것도 하다 보면 자연스럽게 될 것이다.

위의 예에서 보듯이 a[3]이란 것은 문자열 내 특정한 값을 뽑아내는 역할을 해준다. 이러한 것을 인덱싱(Indexing)이라고 부른다.

몇가지를 인덱싱을 더 해 보도록 하자.

 

>>> a[0]
'L'
>>> a[12]
's'
>>> a[-1]
'n'

 

마지막의 a[-1]이 뜻하는 것은 뭘까?

눈치 빠른 분은 이미 알겠지만 바로 문자열을 뒤에서부터 읽기 위해서 마이너스(-)기호를 붙이는 것이다.

즉 a[-1]은 뒤에서부터 세어서 첫 번째가 되는 문자를 말한다.

a는 "Life is too short, You need Python"이라는 문장이므로 뒤에서부터 첫 번째 문자는 가장 마지막 문자인 'n'이 될 것이다.

뒤에서부터 첫 번째 문자를 표시 할 때 a[-0]이라고 해야 하지 않겠는가? 라는 의문이 들수도 있겠지만 잘 생각해 보자.

0과 -0은 똑같은 것이기 때문에 a[-0]이라는 것은 a[0]과 똑같은 값을 보여준다.

 

>>> a[-0]
'L'

 

계속해서 몇가지 예를 더 보자.

 

>>> a[-2]
'o'
>>> a[-5]
'y'

 

위의 첫 번째 예는 뒤에서부터 두 번째 문자를 가리키는 것이고 두 번째 예는 뒤에서부터 다섯 번째 문자를 가리키는 것이다.

그렇다면 "Life is too short, You need Python"이라는 문자열에서 단순히 한 문자만을 뽑아내는 것이 아니라 'Life'또는 'You'같은 단어들을 뽑아낼 수 있는 방법은 없을까?

다음과 같이 하면 될 것이다.

 

>>> b = a[0] + a[1] + a[2] + a[3]
>>> b
'Life'

 

위의 방법처럼 할 수도 있겠지만 파이썬에서는 보다 더 좋은 방법을 제공한다.

바로 슬라이싱(Slicing)이라는 기법이다.

위의 예는 슬라이싱 기법으로 다음과 같이 간단하게 처리할 수 있다.

 

>>> a[0:4]
'Life'

 

a[0:4]가 뜻하는 것은 a라는 문자열 즉, "Life is too short, You need Python"이라는 문장에서 0부터 4까지의 문자를 뽑아낸다는 뜻이다.

하지만 다음과 같은 의문이 들 것이다.

a[0]은 'L', a[1]은 'i', a[2]은 'f', a[3]은 'e'이니까 a[0:3]만으로도 'Life'라는 단어를 뽑아낼 수 있지 않을까?

다음의 예를 보도록 하자.

 

>>> a[0:3]
'Lif'

 

이렇게 되는 이유는 간단하다.

a[시작번호: 끝번호] 처럼 쓰면 끝번호에 해당하는 것은 포함이 되지 않는다.

a[0:3]을 수식으로 나타내면 다음과 같다.

 

0 <= a < 3

 

즉 위의 수식을 만족하는 a는 a[0], a[1], a[2] 일 것이다.

따라서 a[0:3]은 'Lif'이고 a[0:4]는 'Life'가 되는 것이다.

이 부분이 문자열 연산에서 가장 혼동하기 쉬운 부분이니 스스로 많이 연습해 보기를 바란다.

슬라이싱의 예를 조금 더 보도록 하자.

 

>>> a[0:5]
'Life '

 

위의 예는 a[0] + a[1] + a[2] + a[3] + a[4]와 동일하다.

a[4]라는 것은 공백문자 ' '이기 때문에 'Life'가 아닌 'Life '가 되는 것이다.

공백문자 역시 'L', 'i' , 'f', 'e'와 동일하게 취급되는 것을 잊지 말도록 하자.

'Life'와 'Life '는 완전히 다른 문자열이다.

항상 시작번호가 '0'일 필요는 없다.

 

>>> a[0:2]
'Li'
>>> a[5:7]
'is'
>>> a[12:17]
'short'

 

a[시작번호:끝번호]에서 끝번호 부분을 생략하면 시작번호부터 그 문자열의 끝까지를 뽑아내게 된다.

 

>>> a[19:]
'You need Python'

 

a[시작번호:끝번호]에서 시작번호를 생략하면 그 문자열의 처음부터 끝번호까지 뽑아내게 된다.

 

>>> a[:17]
'Life is too short'

 

a[시작번호:끝번호]에서 시작번호와 끝번호를 생략하면 처음부터 끝까지 뽑아낸다.

 

>>> a[:]
'Life is too short, You need Python'

 

a[시작번호:끝번호]에서 시작번호와 끝번호를 모두 생략했기 때문에 이것은 처음부터 끝까지를 말하게 되므로 위와 같은 결과를 보여주는 것이다.

슬라이싱에서 역시 인덱싱과 마찬가지로 '-'기호를 사용할 수가 있다.

 

>>> a[19:-7]
'You need'

 

a[19:-7]이 뜻하는 것은 a[19]에서부터 a[-7]까지를 말한다. 이것 역시 a[-7]은 포함하지 않는다.

 

자주 사용되는 슬라이싱 예

다음은 자주 사용하게 되는 슬라이싱 기법 중의 하나이다.

 

>>> a = "20010331Rainy"
>>> date = a[:8]
>>> weather = a[8:]
>>> date
'20010331'
>>> weather
'Rainy'

 

a 라는 문자열을 두 부분으로 나누는 기법이다.

동일한 숫자 '8'을 기준으로 a[:8], a[8:]처럼 사용을 하였다.

a[:8]은 a[8]이 포함이 안되고 a[8:]은 a[8]을 포함하기 때문에 8을 기준으로 해서 두 부분으로 나눌 수 있는 것이다.

위의 예에서는 "20010331Rainy" 라는 문자열을 날짜를 나타내는 부분인 '20010331'과 날씨를 나타내는 부분인 'Rainy'로 나누는 방법을 보여준다.

위의 문자열 "20010331Rainy"라는 것을 연도인 2001과 월과 일을 나타내는 0331 그리고 날씨를 나타내는 Rainy를 세 부분으로 나누려면 다음과 같이 할 수 있다.

 

>>> a = "20010331Rainy"
>>> year = a[:4]
>>> day = a[4:8]
>>> weather = a[8:]
>>> year
'2001'
>>> day
'0331'
>>> weather
'Rainy'

 

위의 예는 4와 8이란 숫자로 "20010331Rainy"라는 문자열을 세 부분으로 나누는 방법을 보여준다.

이상과 같이 인덱싱과 슬라이싱에 대해서 살펴 보았다.

인덱싱과 슬라이싱은 프로그래밍을 할 때 매우 자주 사용되는 기법이니 꼭 반복해서 연습을 해 두도록 하자.

 

“Pithon”이란 문자열을 “Python"으로 바꾸려면?

위의 제목과 같이 "Pithon"이란 문자열을 "Python"으로 바꾸려면 어떻게 해야 할까?

제일 먼저 떠오르는 생각은 다음과 같을 것이다.

 

>>> a = "Pithon"
>>> a[1]
'i'
>>> a[1] = 'y'

 

위의 예에서 보듯이 우선 a라는 변수에 "Pithon"이란 문자열을 대입하고 a[1]이란 값이 'i'니까 a[1]을 위의 예처럼 'y'로 바꾸어 준다는 생각이다.

하지만 결과는 어떻게 나올까?

당연히 에러가 나고 실패하게 될 것이다.

에러가 나는 이유는 문자열의 요소 값은 바꿀 수 있는 값이 아니기 때문이다.

하지만 앞서 살펴보았던 슬라이싱 기법을 이용해서 "Pithon"이란 문자열을 "Python"으로 바꿀 수 있는 방법이 있다.

다음의 예를 보자.

 

>>> a = "Pithon"
>>> a[:1]
'P'
>>> a[2:]
'thon'
>>> a[:1] + 'y' + a[2:]
'Python'

 

위의 예에서 보듯이 슬라이싱을 이용해서 먼저 'Pithon'이라는 문자열을 'P'부분과 'thon'부분으로 나눌 수 있기 때문에 그 사이에 'y'라는 문자를 추가하여 'Python'이라는 새로운 문자열을 만들면 된다.

 

 

 

예제를 연습해 봅시다