파이썬과 문자열 맛보기
이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.
문자열 (string)
프로그래밍을 하다 보면 숫자도 많이 다루지만, 문자열을 다루는 일도 굉장히 많다. 하지만 문자열이라는 단어 자체가 생소한 사람이 있을 수 있다. 그러면 문자열은 무엇일까?
문자열은 일련의 문자라고 보면 된다.
문자는 키보드를 이용해서 입력할 수 있는 문자라고 보면 된다.
여러분의 컴퓨터(혹은 모바일 기기)를 살펴보면 많은 곳에서 문자열을 발견할 수 있다.
브라우저에 보이는 주소도 문자열이다.
여러분이 읽고 있는 이 글도 문자열이다.
프로그래밍과 문자열은 떼려야 뗄 수 없는 관계라고 볼 수 있다.
생각해보면 변수의 이름도 문자열이 될 수 있을 것 같다. 그러면 문자열과 변수의 이름을 어떻게 구별해야 할까?
문자열임을 표시하기 위해, Python은 ‘ 또는 “을 사용한다. 예를 들자면 다음과 같다.
‘hello world’
“hello world”
‘123’
‘’
문자열의 특징
문자열의 특징을 간단하게 짚어보자.
-
‘hello world’와 “hello world”는 같은 문자열이다. 비록 문자열임을 표현하기 위해 사용한 문자는 다르지만(‘와 “), 내용물이 같으므로 같은 문자열이다.
-
‘123’은 정수가 아니라 문자열이다. 정수 123을 표현하고 싶다면 ‘을 빼야 한다.
-
'’는 빈 문자열을 의미한다.
- 문자열의 경우, ‘로 시작을 했으면 ‘로 끝맺어야 하고, “로 시작을 했으면 “로 끝맺어야 한다. 따라서 다음 예시는 문법 오류이다.
- ‘hello world”
- “hello world’
- ’ 또는 “를 세 개를 쓸 수도 있다. 이 경우, 여러 줄의 문자열을 입력할 때 쓸 수 있다.
- ”"”hello
world!”””
- ”"”hello
-
문자열은 불변이다. ‘hello world’란 문자열을 만들었으면, 이 문자열을 ‘hello waldo’란 문자열로 바꿀 수 없다. 다른 문자열을 쓰고 싶다면 새로 생성해야 한다.
- 문자열은 대/소문자를 구분한다. ‘Hello’와 ‘hello’는 다른 문자열이다.
문자열 다루기
Python에서 제공하는 기본적인 문자열 다루기를 익혀보자.
- 문자열 결합하기
두 문자열을 결합하여 새로운 문자열을 만들고 싶을 때가 있을 수 있다. 이럴 때 사용하는 것은 + 연산자이다. 다음과 같이 사용할 수 있다.
>>> a = 'hello '
>>> b = 'world!'
>>> c = a+b
>>> c
'hello world!'
“숫자도 아닌데 더하기를 쓸수 있네?” 라는 생각을 할 수 있다. 간단하게만 언급하고 넘어가자면, 객체중에는 연산자를 사용할 수 있는 객체가 있다는 정도로만 기억하고 넘어가자. 수와 관련된 객체와 문자열이 여기에 해당된다.
- 문자열 복제하기
하나의 문자열을 여러 번 쓰고 싶을 때가 있을 수 있다. 이럴 때 사용하는 것은 ** * 연산자**이다. 다음과 같이 사용할 수 있다.
>>> a = 'ora' * 4
>>> a
'oraoraoraora'
- 문자열 길이 구하기
문자열의 길이를 구하고 싶다면 다음과 같이 하면 된다.
>>> len('hello world')
11
>>> a = 'hi'
>>> len(a)
2
저번에 배운 print처럼, len도 함수이다. len()에서 괄호 안에 길이를 구하고 싶은 문자열을 집어넣으면 된다.
- 문자열의 특정 위치의 문자에 접근하기
문자열의 특정 위치의 문자에 직접 접근하여 가져올 수도 있다. 다음 문자를 보자.
‘abcdefg’
위의 문자열에서 맨 처음 글자는 ‘a’고, 3번째 글자는 ‘c’다. 그렇다면 Python에서는 어떻게 이러한 정보를 가져올 수 있을까?
[]안에 몇 번째 글자를 가져올 것인지를 적으면 된다. 좀 있어보이는 용어를 사용해 보낟면, 인덱스(index)로 접근한다라고 이야기 한다.
그러면 위의 문자열에서 첫 번째 문자를 가져와보자.
>>> a = 'abcdefg'
>>> a[1]
'b'
첫 번째 문자라서 [] 안에 1을 넣었는데, 두 번째 문자인 ‘b’가 출력되었다. Python은 숫자도 못 세는 멍청이인걸까?
이 내용은 다른 프로그래밍 언어 대부분에서도 통용되는 이야기이다. 프로그래밍 세계에서는 인덱스 계산을 할 때는 0부터 센다. 따라서, 문자열의 맨 처음 글자를 가져오고 싶다면 a[0]으로 해야 제대로 출력이 된다.
>>> a = 'abcdefg'
>>> a[0]
'a'
“왜 0부터 세지?” 라는 의문이 들 수 있다. 그러려면 문자열이 실제로 어떻게 생겨먹었고, 메모리 주소와 관련된 지식도 필요하기 때문에 지금은 그냥 프로그래밍 할 때는 0부터 센다!라는 정도만 기억하고 넘어가는 것이 좋다.
그리고 또 하나 주의해야 할 점이 있다. 길이가 7인 문자열에서 7 이상의 인덱스에 접근하려고 하면 에러가 발생한다.
>>> a[7]
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
a[7]
IndexError: string index out of range
어떻게 보면 당연한 일이다. 지금 위의 요청은 없는걸 내 놓으라! 라고 우기는 것과 다름 없기 때문이다. 없는걸 어떻게 주겠는가? 그리고 없는걸 있다고 속여서 주는 것도 큰 문제가 될 것이다. 잘못된 동작을 눈 가리고 아웅 식으로 계속 돌려봤자 치명적인 문제가 계속 쌓여나갈 뿐이다.
다른 프로그래밍 언어를 하던 사람이면 이런 생각이 들 수 있다.
“인덱스로 접근이 가능하잖아? 그러면 a[1] = ‘a’로 고칠 수 있겠는데?”
본인도 그런 헛된 희망을 잠시나마 품은 적이 있었으나, 아쉽게도 땡이다. 문자열은 그런 기능을 지원하지 않는다는 메시지만 뜰 뿐이다. 다시 한 번 기억하자. 문자열은 불변이다.
그러면 맨 뒤에 있는 글자 하나만 가져오고 싶다면 일일히 문자열의 길이를 구해야 하는가? 라고 물어볼 수 있다. 다른 프로그래밍 언어라면 그럴 수도 있겠으나, Python에서는 아니다. 인덱스를 -1로 하면 해당 문자열의 맨 뒤의 글자를 가져온다.
>>> a[-1]
'g'
>>> a[-2]
'f'
- 문자열의 일부를 가져오기
문자열의 일부를 가져오는 것도 가능하다. 이를 부분 문자열(substring)이라고 부른다.
‘hello world’
라는 문자열이 있으면, ‘hello’만 떼 올수도 있고 ‘lo wor’만 떼 올수도 있다. 부분 문자열을 만들기 위해서는 다음과 같은 문법을 사용하면 된다.
string[begin:end]
string
은 문자열을 가리키는 변수의 이름이다. 따라서, 본인이 추출하고자 하는 문자열 또는 변수 이름을 string
에 집어넣으면 된다.
begin
은 문자열이 시작하는 인덱스, 즉 위치를 의미한다. 인덱스는 0부터 시작한다는 사실을 다시 한번 기억하자.
그리고 begin
을 생략하면 문자열의 맨 처음을 가리키게 된다. 0이 자동으로 들어간다고 봐도 무방하다.
end
는 부분 문자열의 마지막 인덱스 + 1을 의미한다. 다시 말하자면, end
의 인덱스부터는 부분 문자열이 아니다! 라는 것을 의미한다.
그리고 end
를 생략하면 문자열의 맨 끝을 가리키게 된다. 문자열의 길이 값이 자동으로 들어간다고 봐도 무방하다.
즉, begin
인덱스 부터 부분 문자열이 포함되기 시작하고, end
인덱스 부터 부분 문자열이 포함되지 않기 시작한다고 보면 된다. 만약 begin
과 end
의 값이 같다면 빈 문자열이 된다.
그러면 예시를 확인해보자.
>>> a = 'hello world'
>>> a[3:9]
'lo wor'
>>> a[6:]
'world'
>>> a[:5]
'hello'
>>> a[3:3]
''
사실 위의 내용에서 step을 설명하지 않고 넘어갔다. 굳이 지금 알아둘 필요는 없다고 생각해서 일부러 생략하고 넘어간 것이니, 관심이 있으면 지금 찾아봐도 되지만, 나중에도 소개할 내용이므로 찾아보지 않아도 된다.
- 문자열 바꾸기
문자열은 불변이라 수정이 안 된다 말해놓고, 문자열을 바꾸는 기능을 소개하고 있어서 뭐하냐는 소리가 나올 수 있다. 하지만 함수 이름이 replace다. 실제로 기능도 문자열을 바꿔주는 기능을 수행한다. 그럼 무슨 마법을 부린 것일까?
사실 별거 없다. 원본 문자열을 읽어서, 문자열을 수정한 뒤, 새로운 문자열을 돌려주는 것 뿐이다. 문자열은 불변이기 때문에 이런 식으로 새로운 문자열을 생성해서 돌려주는 일이 흔하다는 것을 기억하자.
그러면 이 함수를 어떻게 쓰면 되는지 알아보자.
string.replace(old, new)
string
은 수정하고자 하는 원본 문자열 또는 그 문자열을 가리키고 있는 변수의 이름을 적으면 된다.
replace
은 함수 이름이다. replace는 반드시 이 이름 그대로 써야 한다.
old
는 원본 문자열에서 바꾸려고 하는 문자열을 집어넣으면 된다.
new
는 바꾸려고 하는 문자열을 무엇으로 바꾸고 싶은지 집어넣으면 된다.
그러면 사용 예시를 한 번 보자.
>>> a = 'hello world'
>>> a.replace('hello', 'byebye')
'byebye world'
이렇게 하면 새롭게 바뀐 문자열이 나오는 것을 알 수 있다.
그럼 위에서 a
를 출력하면 뭐가 나올까?
>>> a
'hello world'
그대로 ‘hello world’가 나온다. 왜 그런걸까?
replace의 결과 값을 변수 a
가 가리키게 하지 않았기 때문이다.
replace의 결과는 잠깐 반짝 하고 나타났다가, 이 결과를 가리키고 있는 변수가 아무도 없기 때문에 다시 사라지고 만 것이다.
replace의 결과 값을 계속 가지고 있기 위해선 변수에 대입을 하면 된다.
>>> b = a.replace('hello', 'byebye)
>>> b
'byebye world'
>>> a
'hello world'
>>> a = a.replace('hello', 'byebye)
>>> a
'byebye world'
위와 같이 새로운 변수에게 가리키게 해도 되고, 자기 자신을 새로운 결과에 가리키게 해도 된다. 어떻게 할 지는 상황에 알맞게 하면 된다.
이 외에도 문자열 관련 함수는 굉장히 많다. 다만 모든 기능을 설명하기엔 너무나도 방대해질 수 있어, 나머지는 필요할 때 소개하기로 한다.
특히 몇몇 기능들은 아직 배우지도 않은 형태의 결과값 또는 입력값을 필요로 하기에, 일부러 넘어간 것도 있다.
Comments