문자열 자료형
1. 문자열 자료형이란?
앞에서 만난 정수형
은 정수를 나타내는 자료형
입니다. 실수형
은 실수를 나타내는 자료형
입니다. 여기서 주목해야 할 점은 문자를 나타내는 자료형은 문자 자료형이 아니라 문자열 자료형
입니다. 열
이 붙어있습니다. 열을 맞춰주세요
에 그 열입니다. 하나가 아니라 여러개이며, 순서가 있는 것이죠. 이처럼 문자열 자료형은 단순히 하나의 문자가 아닌, 여러 문자가 나열된 형태를 나타냅니다.
예를 들어, 'hello world'
에서 'h'
는 0
번째에 있는 문자입니다. 컴퓨터 공학은 대부분 0
부터 시작을 하기 때문에 0
번째 있다고 표현해야 소통에 오해가 없습니다. 이처럼 문자열에서 각 문자는 순서를 가지며, 이를 인덱스(index)라고 합니다. 이 문자의 길이는 띄어쓰기 포함하여 11글자 입니다. 이러한 특성을 활용하면 문자열에서 특정 위치의 문자를 추출하거나, 부분 문자열을 잘라내는 등의 작업을 수행할 수 있습니다.
문자열과 관련된 내용은 방대하지만 프로그래밍에서 매우 중요한 자료형 중 하나이기 때문에 실무에서 사용되는 문법을 빠트리지 않고 학습하도록 하겠습니다. 내용이 길더라도 꼼꼼하게 읽어주시길 바랍니다.
1.1 문자열 생성
문자열은 작은 따옴표(') 또는 큰 따옴표(")로 문자들을 감싸 만들 수 있습니다.
작은 따옴표와 큰 따옴표 중 어떤 것을 사용해야 할까요?
작은 따옴표, 큰 따옴표 사용은 회사 컨벤션(회사 코딩 규칙) 맞춰 가시면 됩니다. 저희 회사는 작은 따옴표를 사용하고 있습니다. 이러한 약속은 시스템화 해놓는 것이 좋습니다. 블랙포메터(Black Formatter)와 같은 자동 포멧 툴을 사용하면 저장과 동시에 이러한 규칙을 쉽게 적용할 수 있습니다. 블랙포메터는 큰 따옴표가 기본입니다.
아래 코드처럼 작은 따옴표 3개, 큰 따옴표 3개로 여러 문장도 입력이 가능합니다.
개행까지 잘 입력된 것을 확인할 수 있습니다. 이번에는 코랩에서 print
를 붙이지 않고 i
나 j
를 출력해보세요. 위니북스에서는 한 줄로만 표시되고 \n
이 제대로 표현되지 않으니 아래 내용으로만 참고해주세요.
코랩에서 출력된 텍스트를 확인해보면 마지막 문장이 아래와 같이 나오는데 여기서 \n
와 같은 문자열을 이스케이프 문자라고 합니다. 이스케이프 문자는 문자열 내에서 특수한 기능을 하는 문자로 역슬래시(\
)와 특정 문자를 조합하여 사용합니다. \n
는 개행을 하는 이스케이프 문자입니다. 이스케이프 문자도 이번 챕터에서 다뤄보도록 하겠습니다.
# 코랩에서 출력
'안녕하세요\n저는 위니브의 대표 이호준입니다.\n파이썬 참 좋아요.\n여러분 정말 잘 선택하셨어요.'
# 코랩에서 출력
'안녕하세요\n저는 위니브의 대표 이호준입니다.\n파이썬 참 좋아요.\n여러분 정말 잘 선택하셨어요.'
2. 문자열의 특징
2.1 덧셈과 곱셈 연산
파이썬에서는 문자열끼리 덧셈과 곱셈 연산이 가능합니다. 이러한 특징은 뒤에 나오는 list
나 tuple
에서도 적용됩니다. 셋 모두 순서가 있는 시퀀스형 자료형입니다.
- 덧셈: 문자열을 연결합니다.
x = 'hello' y = 'world' print(x + y) - 곱셈: 문자열을 여러 번 반복합니다.
x = 'hello' print(x * 3)
2.2 문자열 인덱싱
문자열의 순서를 인덱스(index)라고 합니다. 이렇게 인덱스로 해당 위치에 값에 접근할 수 있는 방법을 인덱싱(indexing)이라고 합니다. 인덱스는 0부터 시작하며, 문자열의 마지막 문자의 인덱스는 -1입니다. 숫자를 바꿔가면서 인덱싱을 해보세요.
아래와 같이 범위를 넘어가는 인덱스로 값을 호출하려 하면 에러가 발생하니 주의해주세요. 이러한 에러를 마주쳤을 때 마치 오답노트를 만들듯이 에러명을 기억하는 것이 좋습니다. 해당 에러명은 IndexError
이며 string
에 index
가 범위를 벗어났다고 알려줍니다.
2.3 문자열 슬라이싱
문자열의 일부분을 추출하고 싶을 때에는 인덱스를 사용하여 잘라낼 수 있습니다. 마치 학교에서 2번째 열부터 5번째 열까지는 뒤로 한발짝씩 물러나세요
라고 얘기하는 것처럼요.
2.3.1 슬라이싱
슬라이싱의 기본 문법은 s[start:stop:step]
의 형태를 가집니다. start
는 슬라이싱을 시작할 인덱스, stop
은 슬라이싱을 종료할 인덱스, step
은 슬라이싱할 간격을 나타냅니다. step
은 기본적으로 1
이며 콜론(:
)과 함께 생략될 수 있습니다. 여기서 stop 인덱스
는 슬라이싱 영역에 포함하지 않습니다. 그림을 보면서 예제를 실행해보세요.
2.3.2 다양한 슬라이싱 형태 알아보기
다양한 형태의 슬라이싱을 알아보도록 하겠습니다. 아래 예제로 제시하는 슬라이싱은 모두 실무에서 자주 사용되는 형태입니다. 숫자를 다양하게 바꿔가며 실습해보세요. 양수, 음수, 0, 생략, 터무니 없는 큰 값 등 다양한 경우를 실습해보세요.
첫 번째 예시에서는 start
를 0으로, stop
을 5로 지정하여 인덱스 0부터 4까지의 부분 문자열을 추출합니다. 이때 stop
인덱스는 포함되지 않는 점에 주의해야 합니다.
두 번째 예시는 start
를 6으로 지정하고 stop
을 생략하였습니다. 이 경우 start
인덱스부터 문자열의 끝까지 슬라이싱됩니다.
세 번째 예시는 start
와 stop
을 모두 생략한 경우로, 문자열 전체가 그대로 반환됩니다.
네 번째 예시는 step
을 -1로 지정하여 문자열을 역순으로 슬라이싱합니다. 이는 문자열을 뒤집을 때 유용하게 사용됩니다.
마지막 예시는 step
을 2로 지정하여 한 칸씩 건너뛰면서 슬라이싱합니다.
슬라이싱 시 start
, stop
, step
은 생략 가능합니다. 생략된 경우 start
는 0, stop
은 문자열의 길이, step
은 1로 간주됩니다.
2.3.3 슬라이싱은 에러가 발생하지 않는다
인덱싱은 인덱스가 글자의 범위를 넘어가면 error가 발생하지만 슬라이싱은 범위가 넘어가더라도 오류를 내지 않습니다. 이를 이용해 좀 더 안정적인 코딩을 할 수 있습니다.
2.3.4 헷갈리는 슬라이싱
문제로 풀어보도록 하겠습니다. 아래와 같은 문자열이 있을 때 뒤에 .png를 없애는 코드를 작성해주세요. 이때 .png는 항상 동일하다고 가정합니다.
스크롤을 내리기 전 위 코드를 스스로 풀어보시고 아래 내용을 확인해주세요. 아마도 여러분은 아래와 같이 코딩을 했을 수 있습니다.
s[:11] # 출력 : weniv_licat
s[:11] # 출력 : weniv_licat
다만 위와 같이 코딩을 했을 때는 파일 명이 변하게 되면 대응을 하지 못하게 됩니다. 그래서 아래와 같이 코딩을 해야 합니다.
s[:-4] # 출력 : weniv_licat
s[:-4] # 출력 : weniv_licat
이 코드가 어떻게 동작하는지 궁금하실 것입니다. 어떻게 -4를 넣어 위와같이 실행되는 것일까요? 여러분이 가질 궁금증을 생각해보았습니다.
- 처음 값이 생략되었으니 0이 들어가고 -4가 들어갔으니 음에 방향으로 4개를 출력해야 하는 것이 아닐까요? 그렇다면
.png
가 거꾸로gnp.
로 출력되어야 하는 것이 아닐까요? - step 값이 생략되었으니 1이 디폴트로 들어가서(자동으로 들어가고)
양
에 방향으로 가야하는데 어떻게음
에 방향으로 갔죠? 음
에 방향으로 갔는데 어떻게 앞에서부터 슬라이싱이 되었을까요?
이는 파이썬이 슬라이싱을 할 때 음이든 양이든 모두 그 문자에 본래 위치로 슬라이싱을 하기 때문입니다. -4번째의 문자는 닷(.
) 입니다. 따라서 처음부터 이 닷 위치 바로 직전까지 슬라이싱을 하는 것이죠.
s = 'weniv_licat.png'
s = 'weniv_licat.png'
문제 2번입니다. 파일명이 어떻게 입력되든 확장자를 알고 싶습니다. 위와 같이 입력되었을 때 항상 동일한 확장자명을 알려주는 코드를 작성해주세요. 이때 .png는 항상 동일하다고 가정합니다.
역시나 스크롤을 내리기 전 위 코드를 스스로 풀어보시고 아래 내용을 확인해주세요.
이번에는 정답과 오답을 모두 명시해두었습니다. 자주 사용되는 구문들이니 이해가 잘 안간다면 다시 한 번 살펴보기실 권해드립니다.
2.3.5 슬라이싱 나아가기
슬라이싱은 C구현체로 되어 있어 메서드보다 빠릅니다. 따라서 메서드로 잘라내는 것 보다는 슬라이싱을 적극적으로 활용하시는 것을 권해드립니다.
또한 슬라이싱을 아래처럼 복사하는 용도로도 사용합니다. 다만 리스트, 얕은 복사, 깊은 복사에 대한 개념은 이 챕터에서 설명하지 않고 뒤에서 다룹니다.
3. 문자열 메서드
3.1 lower / upper
lower은 전체 데이터를 소문자로 바꿔주는 메서드이고, upper은 전체 데이터를 대문자로 바꿔주는 메서드입니다.
3.2 find / index
find와 index는 특정 데이터를 찾아서 출력해주는 메서드입니다. 다만 두개의 메서드가 완전히 동일한 기능을 수행하는 것은 아닙니다. 찾을 수 없는 문자열일 경우 find는 -1을 반환하는 반면, index는 error를 반환합니다.
3.2.1 있는 문자열인 경우
CEO는 6번째 자리에 위치하고 있기 때문에 6을 출력합니다.
3.2.2 없는 문자열인 경우
find는 CTO라는 값을 찾을 수 없기 때문에 -1을, index는 error를 출력한 것을 볼 수 있습니다. 다만 error를 출력하지 않기 때문에 항상 find를 사용해야 하는 것은 아닙니다. 적절하게 에러를 출력해주어야 코드를 수정해가며 좀 더 견고한 코드를 작성할 수 있습니다.
3.3 count
count는 특정 문자열이나 숫자의 개수를 셀 때 사용하는 메서드입니다.
i는 총 2번 출현하기에 2를 출력합니다.
3.4 strip
strip은 문자열의 양쪽에 있는 공백을 제거하는 메서드입니다.
위 코드에서 weniv CEO licat
앞과 뒤에 공백이 있습니다. 이를 제거해주면 weniv CEO licat
만 출력됩니다.
양쪽에 공백만 제거하는 것이 아니라 아래처럼 다른 문자열들도 제거할 수 있습니다. 제거하고 싶은 문자를 strip 괄호 안에 문자열로 넣어주면 됩니다. 아래 예제는 공백과 콤마, 느낌표를 제거하는 예제입니다.
3.5 replace
replace는 문자열을 대체하는 메서드입니다. 만약 문자열 중 특정 문자열을 찾아서 다른 문자열로 대체하고 싶을 때 유용합니다. 아래 예제를 살펴보겠습니다.
위 코드에서는 CEO를 CTO로 대체하였습니다. replace 메서드의 첫번째 인자는 대체하고 싶은 문자열이고, 두번째 인자는 대체할 문자열입니다.
replace 메서드는 대소문자를 구분하기 때문에 대소문자를 구분하지 않고 대체하고 싶다면 대소문자를 일치시킨 후 replace 메서드를 사용해야 합니다.
위 코드에서는 ceo를 CTO로 대체하려고 하였지만 대소문자가 일치하지 않기 때문에 replace 메서드가 적용되지 않았습니다. 좀 더 엄밀한 규칙을 적용시키고 싶다면 정규표현식 모듈을 사용하시는 것을 권해드립니다.
replace 메서드를 사용하면 문자열 내에서 모든 문자열을 바꿀 수 있습니다. 아래 예제를 살펴보겠습니다.
위 코드에서는 문자열 내에서 모든 i를 I로 대체하였습니다.
이렇게 수정된 문자열이 원본에 반영되지 않는다는 사실을 기억해주세요.
3.6 split / join
split과 join은 문자열을 나누고 합치는 메서드입니다. 이러한 메서드를 통해 원하는 형식으로 데이터를 분할하고 합칠 수 있습니다. 예를 들어 전화번호가 010 1000 1000
으로 입력이 되었다면 띄어쓰기로 쪼개 010
, 1000
, 1000
로 만들 수 있으며, 이것을 대쉬(-
)로 합쳐 010-1000-1000
처럼 만들 수 있습니다. 많이 사용되는 메서드이니 꼭 기억해주세요.
3.6.1 split
split 메서드는 문자열을 나누는 메서드입니다. 매개변수(괄호 안에 들어가는 값, argument)를 입력하지 않으면 공백을 기준으로 문자열을 나누고, 매개변수를 입력하면 입력한 매개변수를 기준으로 문자열을 나눕니다. 아래 예제를 살펴보겠습니다.
위 코드에서는 문자열을 공백을 기준으로 나누었습니다. 문자열을 나누면 리스트로 반환되며, 나누어진 문자열은 리스트의 원소가 됩니다.
위 코드에서는 문자열을 -
를 기준으로 나누었습니다. 문자열을 나누면 리스트로 반환되며, 나누어진 문자열은 리스트의 원소가 됩니다.
3.6.2 join
join 메서드는 split 메서드와 반대로 리스트를 하나의 문자열로 합치는 메서드입니다. 아래 예제를 살펴보겠습니다.
위 코드에서는 리스트를 -
를 기준으로 하나의 문자열로 합쳤습니다. 리스트를 문자열로 합치면 문자열로 반환됩니다.
join 메서드는 split 메서드와 함께 사용하면 유용합니다. 아래 예제를 살펴보겠습니다.
위 코드에서는 문자열을 공백을 기준으로 나눈 후 -
로 합쳤습니다.
3.7 format
format 메서드는 문자열 내에서 변수의 값을 대입할 때 사용하는 메서드입니다. 아래 예제를 살펴보겠습니다.
위 코드에서는 문자열 내에 {}
를 넣어 변수의 값을 대입하였습니다. format()
메서드를 이용해 {}
에 변수의 값을 순서대로 대입할 수 있습니다.
위 코드에서는 문자열 내에 {}
에 인덱스를 지정해 순서를 바꿔 변수의 값을 대입하였습니다. 아래 있는 문장은 말은 되지 않지만 이처럼 원하는 값을 여러번 중복해서 호출할 수 있습니다.
split는 데이터를 원하는 기준에 따라 쪼개어주는 메서드이고, join은 쪼개어진 데이터를 합쳐주는 메서드입니다.
3.8 문자열 검사 메서드
문자열이 숫자로만 이뤄져 있는지, 알파벳으로만 이뤄져 있는지 등을 검사하는 메서드입니다. 특히 isdigit, isalpha는 많이 사용하니 꼭 기억해주세요.
3.8.1 isalnum
isalnum 메서드는 문자열에 특수문자가 들어가 있으면 False, 한글이나 영어, 일본어, 중국어, 숫자 등 문자와 숫자만 들어가 있으면 True를 반환하는 메서드입니다. 이를 통해 특수문자만 뽑아내거나 특수문자만 남게 하는 것이 가능합니다. 여기서 al는 알파벳, num은 숫자를 뜻하는데요. 알파벳이 영어만을 가리지는 않고, 한글이나 일본어 등도 True로 출력한다는 것을 주의해주세요.
3.8.2 isdigit
isdigit 메서드는 문자열이 숫자로만 이루어져 있는지 확인하는 메서드입니다. 모든 문자가 숫자로 이루어져 있으면 True를 반환하고, 그렇지 않으면 False를 반환합니다.
위 코드에서는 문자열이 숫자로만 이루어져 있기 때문에 True를 출력합니다.
3.8.3 isalpha
isalpha 메서드는 문자열이 알파벳으로만 이루어져 있는지 확인하는 메서드입니다. 모든 문자가 알파벳으로 이루어져 있으면 True를 반환하고, 그렇지 않으면 False를 반환합니다. 앞에서 alnum에서 다뤄봤던 것처럼 영어, 한국어, 중국어 등을 모두 True로 취급합니다. 다만 첫번째 예시는 숫자가 섞여있기 때문에 False입니다.
여기서 한가지 더 주의해야 할 것이 띄어쓰기는 알파벳으로 취급하지 않는다는 것입니다.
3.8.4 isascii
아스키 코드표 안에 있는 것이면 True를 아니면 False를 반환합니다. 주로 영어와 숫자, 일부 특수문자를 포함하고 있는지를 가려낼 때 사용합니다.
3.9 rjust / ljust / center
rjust, ljust, center 메서드는 문자열의 내용을 지정한 길이로 맞추고, 나머지 부분은 지정한 문자로 채우는 메서드입니다.
3.9.1 rjust
rjust 메서드는 문자열을 지정한 길이로 맞추고, 왼쪽을 지정한 문자로 채우는 메서드입니다. 아래 예제를 살펴보겠습니다.
위 코드에서는 문자열을 10자리로 맞추고, 왼쪽을 -
로 채웁니다. 문자열의 길이가 3이기 때문에 왼쪽을 -
로 채운 나머지 7자리를 채웁니다.
3.9.2 ljust
ljust 메서드는 문자열을 지정한 길이로 맞추고, 오른쪽을 지정한 문자로 채우는 메서드입니다. 아래 예제를 살펴보겠습니다.
위 코드에서는 문자열을 10자리로 맞추고, 오른쪽을 -
로 채웁니다. 문자열의 길이가 3이기 때문에 오른쪽을 -
로 채운 나머지 7자리를 채웁니다.
3.9.3 center
center 메서드는 문자열을 지정한 길이로 맞추고, 양쪽을 지정한 문자로 채우는 메서드입니다. 아래 예제를 살펴보겠습니다.
위 코드에서는 문자열을 11자리로 맞추고, 양쪽을 -로 채웁니다. 문자열의 길이가 5이기 때문에 양쪽을 -
로 채운 나머지 6자리를 채웁니다.
숫자가 문자열의 길이보다 작을 경우 문자열 그대로 출력합니다.
3.10 zfill
문자열의 zfill(width)
메서드는 주어진 길이만큼 문자열의 앞쪽을 '0'으로 채워서 반환합니다. 여기서 width
는 채워진 문자열의 전체 길이를 의미합니다. 이 메서드는 숫자를 포함한 문자열에서 자릿수를 일정하게 유지할 때 유용하게 사용됩니다.
이 예제에서 "42" 문자열 앞에 3개의 '0'이 추가되어 "00042"가 출력됩니다.
- 부호가 있는 숫자에 사용하기
이 예제에서는 부호 '-' 뒤에 '0'이 채워져 "−0042"가 출력됩니다.
- 문자열에 사용하기
이 예제에서 "abc" 문자열 앞에 2개의 '0'이 추가되어 "00abc"가 출력됩니다.
zfill()
메서드는 특히 파일명이나 로그의 일련번호를 생성할 때 유용하게 사용됩니다. 예를 들어, 이미지 파일을 저장할 때 일련번호를 부여하되, 모든 파일명의 길이를 동일하게 유지하려 할 때 zfill()
메서드를 사용하여 이를 구현할 수 있습니다.
이 코드를 실행하면, "001.jpg"부터 문자열을 출력하는데 뒤에서 배울 반복문을 통해 수십개, 수백개의 파일명을 동일한 규칙으로 생성할 수 있습니다.
또한 아래와 같이 응용할 수도 있습니다.
3.11 translate
translate()
메서드는 문자열 내의 특정 문자들을 다른 문자로 치환하거나 제거할 때 사용합니다. replace와 다르게 한 번에 많은 문자열들을 원하는 문자로 치환할 수 있습니다.
3.11.1 특정 문자 치환하기
str.maketrans()
를 사용하여 변환 테이블 생성하기
# 변환 테이블 생성
table = str.maketrans("abc", "123")
# 변환 테이블 생성
table = str.maketrans("abc", "123")
이 예제는 'a'는 '1'로, 'b'는 '2'로, 'c'는 '3'로 변환하겠다는 뜻입니다.
translate()
메서드로 문자열 치환하기
text = "abcde"
result = text.translate(table)
print(result) # 123de
text = "abcde"
result = text.translate(table)
print(result) # 123de
'abcde' 중 'a', 'b', 'c'는 변환 테이블에 따라 '1', '2', '3'으로 변경되어 '123de'가 출력됩니다.
3.11.2 특정 문자 제거하기
translate()
메서드는 특정 문자를 제거하는 데도 사용될 수 있습니다. 이를 위해서는 str.maketrans()
의 세 번째 인수로 제거할 문자를 지정합니다.
아래와 같이 이스케이프 문자를 제거하는 용도로도 사용할 수 있습니다.
'paullab CEO leehojun';
'paullab CEO leehojun';
translate()
메서드는 특히 텍스트 데이터를 처리하는 곳에서 많이 사용될 수 있습니다. 예를 들어, 텍스트 내의 특정 문자나 기호를 제거하거나 다른 문자로 치환하려 할 때 이 메서드를 활용할 수 있습니다.
4. 문자열 포매팅
문자열 포매팅은 문자열 내에 변수나 표현식의 값을 삽입하거나, 문자열의 형태를 조절하는 방법을 의미합니다. 파이썬에서는 여러 방법으로 문자열 포매팅을 수행할 수 있습니다.
- % 연산자 사용: % 연산자를 사용하여 문자열 내에 값을 삽입합니다. 오래된 문법이며 현재는 거의 사용하지 않습니다. python 2.x를 사용하지 않는다면 이러한 문법을 찾아보기 힘들 것입니다.
%s
: 문자열%d
: 정수%f
: 부동 소수점 숫자
- format() 메서드 사용:
format()
메서드를 사용하여 문자열 내에 값을 삽입합니다. f-string 용법이 나오기 이전에 많이 사용하던 문법입니다. 이 문법은 이미 앞에 메서드 시간에 다뤄봤기 때문에 간단하게만 살펴보도록 하겠습니다.
- f-string 사용: f-string은 파이썬 3.6부터 지원하는 문자열 포매팅 방법입니다. 문자열 앞에 f를 붙이고, 중괄호{} 안에 값을 넣으면 됩니다.
이 코드에서는 중괄호 안에서 연산을 한 것을 볼 수 있습니다. 다만 이런 중괄호 연산은 코드의 가독성을 떨어트리므로 권하지 않습니다.
5. 이스케이프 문자
이스케이프 문자는 문자열 내에서 특별한 의미를 가지는 문자들을 나타내기 위해 사용되는 특별한 문자 조합입니다. 예를 들어 ‘hello world’라는 문자열 안에 작은 따옴표를 넣고 싶다면 이스케이프 문자를 사용하여 해당 문자의 원래 의미를 "탈출"시켜야 합니다. 주로 백슬래시(\
)로 시작하며, 백슬래시 뒤에 오는 문자와 함께 특정한 문자나 명령을 나타냅니다.
5.1 주요 이스케이프 문자
\n
: 새로운 줄(줄바꿈)을 나타냅니다.\t
: 탭 문자를 나타냅니다.\r
: 커서를 현재 줄의 처음으로 이동합니다.\"
: 큰따옴표를 나타냅니다.\'
: 작은따옴표를 나타냅니다.\\
: 백슬래시를 나타냅니다.
이러한 이스케이프 문자는 아래와 같이 활용될 수 있습니다.