본문 바로가기

Python/Python 기초

파이썬의 문자열

문자열

프로그래밍 용어로 텍스트를 보통 문자열(string)이라고 부른다.

문자열을 문자들의 집합처럼 생각한다면 이해가 될 것이다.

모든 문자와 숫자, 기호들은 문자열이 될 수 있다.

이런 관점에서 여러분의 이름도 문자열이 될 수 있으며 주소도 그럴 수 있다.



문자열 생성하기

파이썬에서는 텍스트를 겹따옴표로 감싸서 문자열을 생성한다.

별 쓸모 없지만 fred란 변수를 만들어 문자열을 담았봤다.

>>> fred = "Why do gorillas have big nostrills? Big  fngers!!"


그런 다음, fred 내부에 있는 것이 무엇인지 확인하기 위해서 다음과 같이 print(fred)를 입력할 수 있다.

>>> fred
'Why do gorillas have big nostrills? Big  fngers!!'


다음과 같이 홀따옴표를 사용하여 문자열을 생성할 수도 있다.

>>> fred ='What is pink and fluffy? Pink fluff!!'
>>> print(fred)
What is pink and fluffy? Pink fluff!!


하지만 홑따옴표(')나 겹따옴표(")만 이용하여 한 줄 이상의 텍스트를 입력하려고 하거나 어떤 따옴표로 시작했는데

다른 따옴표로 끝나는 경우에는 파이썬 쉘이 에러 메시지를 낼 것이다.

예를 들어 다음과 같이 입력해 보자

>>> fred = "How do dinosaurs pay their bills?
SyntaxError: EOL while scanning string literal


그러면 SyntaxError가 발생하는데 이것은 구문에 대한 에러 메시지다.

왜냐하면 끝나는 문자열에 홑따옴표나 겹따옴표를 사용해야 하는 규칙을 지키지 않았기 때문이다.

구문 (Sytanx)라는 말은 문장 안에서 단어들의 배치와 순서를 의미하며,

여기에서는 프로로그램내의 단어와 심볼의 배치와 순서를 의미한다.

따라서 SyntaxError라는 말은 무엇인가가 파이썬이 예상하지 못한 순서로 되어있다는 뜻이거나,

파이썬이 기대한 무언가를 빠뜨렸다는 의미다.

EOL은 end-of-line이라는 뜻으로, 그 뒤에 있는 에러 메시지는

파이썬이 그 줄의 끝까지 읽어 봤는데 문자열을 닫는 겹따옴표가 없었다는 것을 여러분에게 알려주는 것이다.

문자열에 한 줄 이상의 여러 줄로 된 텍스트를 사용하려면

(멀티라인 문자열(multiline string)이라고도 한다) 세 개의 홑 따옴표(''')를 사용하고,

다음과 같이 각 줄의 사이에  ENTER를 입력한다.

>>> fred = '''How do dinosaurs pay their bills?
with tyrannosaurus checks!'''
>>> print(fred)
How do dinosaurs pay their bills?
with tyrannosaurus checks!



문자열과 관련된 문제들을 처리하기

이제 파이썬이 에러 메시지를 표시하게 되는 문자열에 대한 몇 가지 복잡한 예제를 살펴보자.

>>> silly_string = 'He said, "Aren't can't shouldn't wouldn't."'
SyntaxError: invalid syntax


첫 번째 줄에서 우리는 홑따옴표로 감싼 문자열(변수를 silly_string로 정의함)을 생성하려고 시도했다.

하지만 텍스트에는 can't와 shouldn't, wouldn't라는 단어에 홑따옴표뿐만 아니라 겹따옴표도 섞여있다.

완전히 엉망이다!

파이썬은 사람만큼 영리하지 못하다는 것을 명심하자. 따라서 파이썬이 보는 문자열은

He said,"Aren일 뿐이며, 그 뒤에 다른 글자들이 있다고 기대하지 않는다.

파이썬이 따옴표(홑따옴표든 겹따옴표든)표시를 보면, 처음에 있는 표시 다음부터 시작하여

그 줄에서 그다음에 나오는 표시까지를 인식하게 된다.


이 예제에서는 He 앞에 있는 홑따옴표부터 시작하며, 그 줄에서 파이썬이 익실할 수 있는

끝은 Aren의 n 다음의 홑따옴표다.

IDLE은 잘못된 곳을 강조한다.


IDLE의 마지막 줄은 어떤 종류의 에러가 발생했다는 것을 알려준다.

(이 예제에서는 syntax error)


홑따옴표 대신에 겹따옴표를 사용해도 에러가 발생한다.

>>> silly_string = "He said, "Aren't can't shouldn't wouldn't.""

SyntaxError: invalid syntax


여기서 파이썬은 겹따옴표 안에 있는 문자열을 인식하게 되며, 그것은 He said, (공백까지 포함)이다.

그 다음에 있는 모든 문자열들이 에러가 된다.


파이썬의 관점에서 에러가 나는 이유는 나머지 것들 전부는 거기에 있지 말아야 하기 때문이다.

파이썬은 따옴표와 쌍을 이루는 다음 번 따옴표를 찾을 뿐이지, 여러분이 텍스트에서 언습하고자 하는 것들이 무엇인지는 알지 못한다.

이러한 문제에 대한 해결책은 앞에서 배웠던 세 개의 홑따옴표(''')를 사용하는 

멀티라인 문자열이다.

이것은 에러 없이 문자열에 겹따옴표와 홑따옴표를 혼합하여 사용할 수 있게 해준다.

사실, 만일 우리가 세 개의 홑따옴표를 사용한다면 문자열 내의 홑따옴표와

겹따옴표의 조합을 얼마든지 사용할 수 있게 된다

(거기에 세 개의 홑따옴표를 사용하지 않는 한).

에러가 없는 문자열의 버전의 모습은 다음과 같을 것이다.


silly_string = '''He said, "Aren't can't shouldn't wouldn't."'''

잠깐만! 더알아야할 것이 있다.

만약에 여러분이 파이썬에서 홑따옴표나 겹따옴표를 정말로 사용하고 싶다면, 세 개의 홑따옴표 대신에

문자열에 있는 각각의 따옴표 앞에 백슬래시(\)를 추가할 수도 있다.

이것을 이스케이핑(escaping)이라고 부른다.

이것은 파이썬에게 "그래, 내가 쓴 문자열 안에 따옴표가 있다는 것을 나도 알아. 그런데

난 네가 마지막 따옴표가 나타날 때까지 이것을 무시해줬으면 좋겠어."라고 말하는 것이다.


문자열 이스케이핑은 문자열을 읽는 데 방해될 수 있으므로 멀티라인 문자열을 사용하는 것이

더 좋을 것이다. 이스케이핑을 사용하는 코드를 볼 수도 있기에, 백슬래시가 거기에 있는

이유를 살펴보도록 하자.

다음은 이스케이핑이 어떻게 동작하는지를 보여주는 몇 가지 예제다.

>>> single_quote_str = 'He said, "Aren\'t can\'t shouldn\'t wouln\'t."'
>>> double_quote_str = "He said, \"Aren't can't shouldn't wouldn't.\""
>>> print(single_quote_str)
He said, "Aren't can't shouldn't wouln't."
>>> print(double_quote_str)
He said, "Aren't can't shouldn't wouldn't."
>>> 


먼저 홑따옴표와 문자열 내에 있는 홑따옴표 앞에 백슬래시를 이용하여 문자열을 생성 한다.

겹따옴표와 문자열 내에 있는 겹따옴표 앞에 백슬래시를 이용하여 문자열을 생성 한다.

다음 줄에서는 우리가 생성한 변수들을 출력한다.

여기서 주목할 것은 백슬래시 문자는 출력할 때 나타나지 않는다는 점이다.



문자열에 값을 포함하기

만약에 변수의 값을 이용하여 메시지를 표시하고자 한다면, 나중에 추가할 값에 대한 표시인 %s를 이용하여

문자열에 값을 포함시킬 수 있다(값을 포함하는 것을 프로그래머들은 "값 삽입하기"라고 한다).

예를 들어, 게임에서 여러분이 기록한 점수를 파이썬이 계산하거나 저장한 다음에 그것을

"I scored ___points"라는 문장에 추가하려면, 그 문장 안에 그 값을 위치할 곳으로 %s를 이용하고

파이썬에게 그 값을 알려준다.


>>> myscore = 1000
>>> message = 'I scored %s points'
>>> print(message % myscore)

I scored 1000 points

>>> print('score: %s' %(myscore))
score: 1000


여기서 우리는 값으로 1000을 가진 myscore라는 변수를 생성하고, 점수를 표시하기 위한 곳인

%s가 있는 'I scored %s points'라는 단어들을 가진 문자열로 message 변수를 생성한다.

다음 줄에서는 print(message)를 호출한다. % 은 파이썬에게 myscore 변수에 저장된 값으로 %s를

대체하라고 알려주는 것이다.

이 메시지를 출력한 결과는 I scored 1000 points이다.

값에 대한 변수를 사용하지 않아도 되며, print(message % 1000)라고 해도 동일한 작업을 하게 된다.


다음 예제와 같이 다른 변수를 이용하여 %s에 다른 종류의 값을 전달할 수도 있다.

>>> joke_text = '%s: a device for finding furniture in the dark'
>>> bodypart1 = 'knee'
>>> bodypart2 = 'Shin'
>>> print(joke_text % bodypart1)
knee: a device for finding furniture in the dark
>>> print(joke_text % bodypart2)
Shin: a device for finding furniture in the dark



여기서는 세 개의 변수를 생성한다.

첫 번째 변수인 joke_text는 %s 표시로 시작한다.

그 외의 다른 변수들은 bodypart1과 bodypart2다.

우리는 joke_text변수를 출력하는 데 한 번은 bodypart1변수의 내용으로

또 한 번은 bodypart2 변수의 내용으로 사용하기 위해 % 연산자를 써서 서로 다른 메시지를 출력하게 한다.

문자열 안에서 하나 이상의 플레이스 홀더(placeholder)를 사용할 수도 있다.

>>> nums = 'What did the number %s say to the number %s? Nice belt!!'
>>> print(nums % (0, 8))
What did the number 0 say to the number 8? Nice belt!!


하나 이상의 플레이스 홀더를 사용하면 예제와 같이 대체할 값들을 괄호로 묶어야 한다.

값의 순서는 문자열에서 사용될 순서다.



문자열 곱하기

10에 5를 곱하면 어떻게 될까?
그 답은 물론 50이다. 하지만 10에 a를 곱하면 무엇이 될까?

다음은 파이썬의 대답이다.

>>> print(10 * 'a')

aaaaaaaaaa


파이썬 프로그래머들은 쉘에서 메시지를 표시할 때

특정 수의 공백을 가진 문자열들로 줄을 맞추기 위해서 이러한 방법을 사용한다.

다음의 예제는 쉘에서 어떻게 출력될까?

(File > NewFile 을 선택하고 다음의 코드를 입력하자)


spaces = ' ' * 25
print('%s 12 butts Wynd' % spaces)
print('%s Twinklebottom Heath' % spaces)
print('%s West Snoring' % spaces)
print()
print()
print('Dear Sir')
print()
print('I wish to report that tiles are missing from the')
print('outside toilet roof.')
print('I think it was bad wind the other night that blew them away.')
print()
print('Regards')
print('Malcolm Dithering')


쉘 창에서 이 코드를 입력했다면 File > SaveAs를 선택한다.

파일명을 myletter.py 라고 하자.


이 예제에서 첫 번째 줄의 빈 칸을 25번 곱한 spaces 변수를 생성한다.

그 다음의 세 줄에서 텍스트를 쉘의 오른쪽으로 정렬하기 위해 그 변수를 사용한다.

그러면 다음과 같은 print 구문의 결과를 보게 될 것이다.



정렬을 위하여 곱셈을 사용하는 것뿐만 아니라, 이상한 메시지를 화면에 채우기 위해서도

사용될 수 있다. 다음 예제를 직접 실행해보자

>>> print(1000 * 'snirt')






파이썬에서는 변수에 ' ' 따옴표로 이루어진 값을 대입하면 문자열 변수가 된다.

문자열 변수는 마치 리스트 처럼 [] 연산자를 이용하여 아이템에 접근할 수 있다.

>>> value = 'string'
>>> value
'string'
>>> value[0]
's'
>>> value[1]
't'
>>> value[5]
'g'



또한 문자열 변수에서 사용하는 증가대입 연산자는

문자열을 붙여나가는데 사용된다.

>>> value = 'a'
>>> value += 'b'
>>> value += 'c'
>>> value
'abc'



for에서 문자열은 하나의 문자로 이루어진 리스트처럼다룬다.

만약 문자열이 'Hello' 라면  for symbol in 'Hello' 는 for symbol in ['H','e','l','l','o'] 와 동일하다.

각 반복문에서 symbol은 message의 각 글자의 값을 가진다.

>>> message = 'Hello'
>>> for symbol in message:
	print(symbol)

H
e
l
l
o
>>> message = 'Hello'
>>> for symbol in ['H','e','l','l','o']:
	print(symbol)

H
e
l
l
o
>>> 


'Python > Python 기초' 카테고리의 다른 글

클래스와 객체를 사용하는 방법  (0) 2014.10.26
튜플 (Tuple)  (0) 2014.10.26
None 값 (The None Value)  (0) 2014.09.26
리스트 레퍼런스 (List References)  (0) 2014.09.25
다중 대입 (Multiple assignment)  (0) 2014.09.24