문자열(String)은 단어 혹은 문장과 같은 문자들의 집합체를 의미한다. 파이썬에서는 이를 나타내기 위하여 큰따옴표 혹은 작은따옴표로 감싸 표현하게 된다. 소수점을 포함한 숫자가 모두 실수 자료형을 가지게 되는 것과 같이 따옴표로 감싼 자료는 문자열로 취급된다. 아래의 코드를 확인하여 보자.
>>> var = "a"
>>> type(var)
<class 'str'>
>>> var = '1'
>>> type(var)
<class 'str'>
>>> var = "3.14"
>>> type(var)
<class 'str'>
위 코드와 같이 숫자형의 자료를 따옴표로 감싸게 되어도 문자열 형태로 나타나게 됨을 주의하여야 한다.
그렇다면 이쯤에서 왜 문자형이 아닌 문자열이라고 표현하는 지에 대한 궁금증이 생길 수 있다. 일전에 우리는 컴포지트 데이터 타입을 두 개 이상의 복합적인 값을 저장할 수 있는 자료형이라고 이야기했다. 실질적으로 문자열은 글자들의 나열로 표현된다. 즉 하나의 글자 성분이 아닌 여러 개의 글자로 구성된다는 이야기이다.
따라서 우리는 이러한 특성에 의하여 문자열이라고 흔히 표현하게 된다. 다만 특정 언어에서는 이러한 문자형 char
과 문자열 string 또는 char[] 등
을 구분하는 경우도 발생하니, 언어의 특성에 따라 이를 적절히 활용하도록 한다.
대부분의 인간의 커뮤니케이션이 문자로 이루어지기 때문에 문자열은 여러 기능을 탑재하고 있으며, 우리도 많은 지면을 할애하여 문자열에 대해서 설명하고자 한다.
문자열은 흔히 아래와 같은 방법으로 만들게 된다. 다만 문자열 안에 큰따옴표 혹은 작은따옴표를 포함하기 위해서는 전체를 둘러싸는 따옴표를 내부에 포함되는 따옴표와 다른 것을 택하여 사용하여야 한다. 아래의 코드를 살펴보도록 하자.
>>> "Hello World"
'Hello World'
>>> 'Hello World'
'Hello World'
>>> """Hello World"""
'Hello World'
>>> '''Hello World'''
'Hello World'
기본적으로 문자열을 만들 때에는 따옴표를 한 개 혹은 세 개 사용하여 문자열을 만들 수 있다.
>>> "Hello "World""
File "<stdin>", line 1
"Hello "World""
^^^^^
SyntaxError: invalid syntax
>>> 'Hello 'World''
File "<stdin>", line 1
'Hello 'World''
^^^^^
SyntaxError: invalid syntax
만약 내부에 따옴표를 삽입하고 싶다하여 동일한 따옴표를 사용하게 되면 올바르지 못한 문법(invalid syntax)이라는 오류를 만나게 된다. 이러한 경우를 피하기 위해서는 아래와 같이 사용하면 된다.
>>> "Hello 'World'"
"Hello 'World'"
>>> 'Hello "World"'
'Hello "World"'
>>> "Hello \"World\""
'Hello "World"'
>>> 'Hello \'World\''
"Hello 'World'"
서로 다른 따옴표의 조합이나 백슬래시(\)
를 이용하여 문자열 내부에 따옴표를 추가할 수 있다.
이스케이스 시퀀스(Escape Sequence)란 프로그램 언어도 특정 문자를 명령을 위한 문자로 사용하고 있기 때문에 이러한 이유로 표현할 수 없는 문자들을 표현해주기 위해서 만들어졌다. 대게 백슬래쉬(\)
와의 조합을 통하여 사용하며, 한글 윈도우를 사용하는 사용자라면 한국 원 통화기호(₩)
가 대체되어 표기되기도 한다.
아래의 코드를 보며 이스케이프 시퀀스의 사용 예를 확인해보도록 하자.
>>> print("Hello \nWorld")
Hello
World
>>> print("Hello \tWorld")
Hello World
>>> print("Hello \\World")
Hello \World
위에서 사용한 print()
함수는 입력받은 값을 출력하는 함수이다. 결과값을 살펴보면 각각의 이스케이프 시퀀스가 여러 출력 결과를 나타낸 것을 볼 수 있으며, 위의 문자열을 만드는 법에서 큰따옴표 및 작은따옴표를 출력할 때 백슬래시를 사용한 것도 이스케이프 시퀀스의 일종이다.
이스케이프 시퀀스의 몇 가지 종류로는 아래와 같다.
코드 | 표현 |
---|---|
\n | 줄 바꿈을 만들 때 사용 |
\t | 문자열에서 탭 간격을 만들 때 사용 |
\' | 작은따옴표를 표현할 때 사용 |
\" | 큰따옴표를 표현할 때 사용 |
\ \ | 백슬래시를 표현할 때 사용 |
더 많은 이스케이프 시퀀스가 있으나 자주 사용하는 이 정도만 확인하고 넘어가도록 하자.
파이썬에서는 문자열 간의 연산이 가능하다. 혹시라도 이전에 언급했던 문자와 숫자 간의 연산과는 확연하게 다르다. 기본적으로 이쪽은 문자가 아닌 문자열이기 때문이다.
아래의 코드로 간단하게 짚고 넘어가도록 하자.
>>> 'Hello' + 'World'
'HelloWorld'
>>> 'Hello' * 2
'HelloHello'
대부분의 사람들은 숫자를 셀 때 1부터 시작하겠지만, 대부분의 컴퓨터 및 프로그래밍 언어는 0부터 숫자 세기를 시작한다. 우리는 어느 단어나 문자가 있을 때 특정 글자를 표현하기 위해서 앞에서부터 몇 번째 글자 등으로 표현하기도 한다. 파이썬에서도 문자열 중 어느 특정한 한 글자를 표현하는 방법이 있으며, 이를 문자열 인덱싱이라고 한다.
아래의 코드를 통하여 문자열 인덱싱에 대해서 알아보도록 하자.
>>> var = "Hello"
>>> var[0]
'H'
>>> var[3]
'l'
>>> var[4]
'o'
>>> var[-1]
'o'
>>> var[-3]
'l'
인덱싱은 가장 첫번째 글자는 0
으로 시작하여 문자열에서 해당하는 순서의 값을 추출하게 된다. 이때 뒤에서부터 계산하려면 음수의 값을 넣으면 되며, 가장 마지막 글자를 -1
로 하여 계산하게 된다.
인덱싱과 슬라이싱에서 가장 중요한 점은 주어진 문자열에 대한 부분 문자열을 추출할 수 있다는 점이다. 쉽게 말하자면 몇 번째 글자부터 몇 번째 글자만을 떼어내어 사용할 수 있다는 점이다. 아래의 코드를 확인하여 보자.
>>> var = "Hello Python World"
>>> var[6:12]
'Python'
파이썬에서는 대괄호 안에 특정 시작값과 콜론, 끝값을 구성하여 슬라이싱을 진행할 수 있다. 이 때 다음과 같은 규칙이 성립된다.
$$ var[start:end] $$ 일 때 추출의 범위는
$$ start \leq var < end $$
단, $$ var $은 정수, $ start $의 값이 없을 때에는 문자열의 처음부터 슬라이싱을 시작하며, $ end $$의 값이 없을 때에는 문자열의 끝까지 슬라이싱한다.
아래를 통해 슬라이싱의 몇 가지 예시를 확인하여 보도록 하자.
>>> var = "Hello Python World"
>>> var[:10]
'Hello Pyth'
>>> var[10:]
'on World'
>>> var[:]
'Hello Python World'
>>> var[6:-6]
'Python'
인덱싱과 슬라이싱이 가능한 이유는 컴포지트 데이터 타입이며 반복 가능(iterable)하기 때문이다. 이를 통해 앞으로 소개할 반복 가능한 컴포지트 데이터 타입에서도 이러한 인덱싱과 슬라이싱 기법이 유효함을 추측해볼 수 있다.
이때 반복 가능이라는 의미는 각 요소를 하나씩 차례대로 반환 가능하다는 의미로, 인덱싱과 슬라이싱은 이 개념을 이용하여 각각 반복 가능한 특정 요소의 위치의 따라 해당 요소를 참조하는 행위, 인덱스를 기반으로 반복 가능한 요소의 하위 요소 혹은 집합을 추출하는 것이라고 정의내릴 수도 있다.
문자열은 사용자와의 측면에서 가장 많이 이용되는 자료형임이 분명하다. 따라서 이러한 문자열을 더욱 효율적으로 사용할 수 있도록 도와주는 함수들이 많이 구비되어 있는 경우가 많다. 본 지에서도 많이 이용하는 몇가지의 함수를 함께 살펴보도록 한다. 다만 아래에서 설명하는 함수보다 더 많은 유용한 함수가 존재하기 때문에 스스로 필요한 함수들을 학습하는 것도 좋은 방향이 될 것이다.
문자열 포맷을 지정하기 위한 format 함수
대부분의 프로그램에서는 변수와 값과 지정된 형식의 문구를 함께 사용하는 경우가 많다. 가령 소비재의 계산을 위한 프로그램을 작성한다고 가정했을 때 사용자에게 출력하는 문구가 {금액}원을 결제합니다.
등의 문구를 출력하여야 한다. 이때 {금액}
부분의 경우에는 변수 등에 저장되어 있는 값으로 출력 시마다 변경되어야 하는 값이다. 이러한 문제상황을 쉽게 해결하기 위해 format()
함수가 제시된다.
아래를 통하여 그 코드를 확인하여 보자.
>>> print("{}원을 결제합니다.".format(10000))
10000원을 결제합니다.
>>> print("{}원을 결제합니다.".format(1000))
1000원을 결제합니다.
>>> print("{}원을 {}를 통하여 결제합니다.".format(1000, '카드'))
1000원을 카드를 통하여 결제합니다.
>>> print("{}원을 {}를 통하여 결제합니다.".format(1000, '현금'))
1000원을 현금를 통하여 결제합니다.
>>> print("{price}원을 {payment}를 통하여 결제합니다.".format(payment='카드', price="1000"))
1000원을 카드를 통하여 결제합니다.
각 중괄호에 별도의 이름을 지정하지 않으면 순서대로 입력하게되며, 이름을 지정했을 때에는 이름=값
형식으로 입력하면 된다.
소문자와 대문자 간의 변환
파이썬에서는 소문자와 대문자 간의 변환을 쉽게 할 수 있으며, 이 때 이용하는 것이 upper()
함수와 lower()
함수이다.
>>> print("Hello World".upper())
HELLO WORLD
>>> print("Hello World".lower())
hello world
특정 문자열 변경하기
문자열의 특정 단어를 모두 대치(replace)하고 싶을 때에는 replace
함수를 이용한다.
>>> print("Hello World".replace('Hello', 'Good Morning'))
Good Morning World
>>> var = "Hello Hello World"
>>> var.replace("Hello", "Nice")
'Nice Nice World'
문자열 분리하기
띄어쓰기에 따라 분리된 문자열이나, 특정 구분 기호로 분리된 자료를 파이썬에서는 보다 쉬운 형태로 분리하여 낼 수 있다. 이 때 이용하는 함수가 split()
이다. 아래의 코드를 통해 확인하여 보자.
>>> var = "동해물과 백두산이 마르고 닳도록"
>>> print(var.split(' '))
['동해물과', '백두산이', '마르고', '닳도록']
>>> print("나보기가, 역겨워, 가실때에는".split(','))
['나보기가', ' 역겨워', ' 가실때에는']
>>> print("010-1234-5678".split('-'))
['010', '1234', '5678']
>>> print("2022-09-14".split('-'))
['2022', '09', '14']
여러 비정형화된 데이터를 이용할 때 split()
함수는 유용하게 사용될 수 있다. 이때 확인할 점은 반환되는 값이 대괄호로 둘러싸여진 자료형이다. 이러한 자료형의 형태를 조회하기 위하여 type()
함수를 사용하면 다음과 같다.
>>> print(type([]))
<class 'list'>
대괄호로 둘러싸여 쉼표로 구분되는 이러한 자료형을 list
라고하며, 연속적으로 나열된 값에 대한 자료형이다. 앞으로의 컴포지트 데이터 타입에서 다시 언급하도록 하겠다.
문자열 조합하기
위에서는 문자열을 리스트의 형태로 분리하였다. 이와 반대되는 join()
함수를 각 요소가 함수에 어디에 위치하는지를 중심적으로 확인해보도록 하자.
>>> date = ['2022', '09', '14']
>>> '-'.join(date)
'2022-09-14'
>>> print(" ".join(['동해물과', '백두산이', '마르고', '닳도록']))
동해물과 백두산이 마르고 닳도록
문자열의 양 끝의 공백 혹은 특정 문자열 제거하기
파이썬에서는 양 끝 혹은 각각의 문자열의 끝에 추가된 특정 문자열을 제거할 수 있으며, 이때 앞뒤로 삽입된 불필요한 공백을 제거할 수 있다. 이러한 기능을 제공하는 함수는 세 가지로 각각 오른쪽, 왼쪽, 양쪽으로 제거하는 rstrip()
, lstrip()
, strip()
함수이다.
각각의 함수에 전해진 값에 따라서 해당하는 문자열를 제거하며, 이때 아무런 문자열를 전달하지 않으면 공백문자(Whitespace)를 제거한다.
>>> var = " Hello World "
>>> var.rstrip()
' Hello World'
>>> var.lstrip()
'Hello World '
>>> var.strip()
'Hello World'
특정 값을 지우고 싶다면 아래처럼 원하는 문자열을 제거할 수 있다.
>>> var = "####Hello World####"
>>> var.rstrip('#')
'####Hello World'
>>> var.lstrip('#')
'Hello World####'
>>> var.strip('#')
'Hello World'
이 때 유념할 점은 중간에 포함된 문자열은 삭제하지 않는다는 점이다.