본문으로 건너뛰기

인덱스와 자르기

파이썬 목차문자열 다루기레슨 12 / 59

목차

문자열의 글자에는 0부터 시작하는 자리 번호(인덱스, index)가 붙어 있습니다. s[0]처럼 번호로 한 글자를 꺼내고, s[1:3]처럼 시작과 끝 번호를 주면 그 사이를 잘라 냅니다. 끝 번호의 글자는 들어가지 않습니다.

날짜 '2026-10-15'에서 월만 떼어 내거나, 전화번호의 가운데 네 자리를 가리려면 글자의 자리를 짚어 꺼내야 합니다. 자리 번호는 1이 아니라 0부터 세고, 자르기는 끝 번호를 빼고 꺼냅니다. 이 두 가지를 놓치면 한 글자씩 어긋난 결과가 나옵니다.

5단계 중 1단계. 1번 줄: 이름 s가 문자열 'python'에 붙습니다. 글자마다 자리 번호가 있습니다. 앞에서는 0부터, 뒤에서는 -1부터 셉니다.

1자리 번호는 0부터

문자열 'python'의 글자마다 앞에서부터 0, 1, 2, … 번호가 붙습니다. 번호는 '첫 글자에서 몇 칸 떨어져 있나'를 셉니다. 첫 글자는 0칸 떨어져 있어 0번입니다.

글자python
번호012345
뒤에서-6-5-4-3-2-1

이름 뒤 대괄호에 번호를 넣으면 그 자리의 글자 하나를 꺼냅니다.

s = 'python'
print(s[0])
print(s[1])
print(s[5])
실행 결과
p
y
n

여섯 글자의 마지막 번호는 6이 아니라 5입니다. 마지막 번호는 늘 len(s) - 1입니다.

2음수 번호는 뒤에서 센다

번호 앞에 -를 붙이면 뒤에서부터 셉니다. 마지막 글자가 -1, 그 앞이 -2입니다. 0은 이미 첫 글자라 뒤에서는 -1부터 셉니다.

s = 'python'
print(s[-1])
print(s[-2])
print(s[len(s) - 1])
실행 결과
n
o
n

s[-1]과 s[len(s) - 1]은 같은 글자입니다. 길이를 몰라도 마지막 글자를 꺼낼 수 있어 -1을 많이 씁니다.

3자르기 [시작:끝] — 끝 자리는 빠진다

대괄호 안에 시작:끝을 쓰면 시작 번호부터 끝 번호 바로 앞까지 잘라 새 문자열을 만듭니다. 이것을 자르기라 하고, 자료에 따라 슬라이싱(slicing)이라고도 부릅니다. 아래 코드는 무엇을 찍을까요?

s = 'python'
print(s[1:3])
실행 결과 보기
실행 결과
yt

예상과 다르면 그곳이 배울 곳입니다. [1:3]은 1번 y와 2번 t만 꺼냅니다. 끝 번호 3의 h는 들어가지 않습니다. 꺼낸 글자 수는 끝 − 시작, 곧 3 − 1 = 2입니다.

시작이나 끝을 비워 두면 '처음부터'나 '끝까지'가 됩니다. 시작에 음수를 쓰면 뒤에서 센 자리부터입니다.

s = 'python'
print(s[:2])
print(s[2:])
print(s[-3:])
print(s[:2] + s[2:])
실행 결과
py
thon
hon
python

s[:2]와 s[2:]는 2번 자리에서 정확히 갈려, 둘을 이으면 처음 문자열이 됩니다. 끝 번호를 빼기 때문에 겹치거나 빠지는 글자가 없습니다. 자르기는 새 문자열을 만들 뿐입니다. 이름 s는 그대로 'python'에 붙어 있습니다.

4없는 자리를 짚으면

글자 하나를 꺼낼 때 없는 번호를 쓰면 오류가 납니다.

s = 'python'
print(s[10])
실행 결과
Traceback (most recent call last):  File "main.py", line 2, in <module>    print(s[10])          ~^^^^IndexError: string index out of range

맨 아래 줄은 '문자열의 자리 번호가 범위를 벗어났다'는 뜻입니다. 'python'의 번호는 앞에서 0~5, 뒤에서 -1~-6이라 10은 없는 자리입니다. 2번 줄의 ^ 표시가 [10]을 가리킵니다.

자르기는 범위를 벗어나도 오류가 나지 않습니다. 있는 글자까지만 꺼내고, 하나도 없으면 빈 문자열 ''을 만듭니다.

s = 'python'
print(s[4:10])
print(len(s[10:]))
실행 결과
on
0

예제

전화번호의 가운데 네 자리를 별표로 가립니다. 앞 네 글자와 뒤 네 글자를 잘라 f-문자열로 잇습니다.

phone = '010-1234-5678'
head = phone[:4]
tail = phone[-4:]
masked = f'{head}****-{tail}'
print(masked)
print(phone)
실행 결과
010-****-5678
010-1234-5678

2번 줄의 phone[:4]는 0~3번 '010-'이고, 3번 줄의 phone[-4:]는 뒤에서 네 글자 '5678'입니다. 4번 줄이 그 사이에 '****-'를 끼워 새 문자열을 만듭니다. 6번 줄처럼 phone은 그대로입니다. 자르기와 f-문자열은 새 문자열을 만들 뿐 원래 문자열을 바꾸지 않습니다.

자주 틀리는 곳

틀린 생각: [1:3]은 3번 자리까지 꺼낸다.

'1부터 3까지'로 읽으면 3번 글자도 드는 것 같지만, 자르기는 끝 번호의 글자를 넣지 않습니다.

s = 'python'
print(s[1:3])
print(s[1:4])
실행 결과
yt
yth

[1:3]은 1번 y와 2번 t 두 글자, [1:4]는 3번 h까지 세 글자입니다. 반복 단원의 range(1, 4)도 같은 규칙으로 4를 넣지 않습니다.

맞는 규칙: 자르기는 끝 번호 바로 앞에서 멈춥니다. 그래서 끝 번호는 꺼낼 마지막 글자의 다음 번호로 쓰고, 끝까지 꺼낼 때는 비웁니다.

틀린 생각: 첫 글자의 자리 번호는 1이다.

글자를 셀 때는 하나, 둘 하고 1부터 세니 첫 글자가 1번 같지만, 자리 번호는 0부터입니다.

s = 'python'
print(s[1])
print(s[0])
실행 결과
y
p

[1]은 둘째 글자 y를 꺼내고, 첫 글자 p는 [0]으로 꺼냅니다.

맞는 규칙: 자리 번호는 첫 글자에서 몇 칸 떨어져 있는지를 세어 첫 글자가 0번입니다. 첫 글자는 [0], 마지막 글자는 [-1]로 꺼냅니다.

틀린 생각: 자르기도 없는 자리를 짚으면 오류로 멈춘다.

글자 하나를 꺼낼 때 없는 번호가 오류였으니 자르기도 그럴 것 같지만, 4절처럼 s[10]은 IndexError로 멈추고 s[10:]은 빈 문자열을 만듭니다.

맞는 규칙: 자르기는 범위를 벗어나도 있는 글자까지만 꺼내고, 하나도 없으면 빈 문자열을 만듭니다. 오류로 멈추는 것은 글자 하나를 번호로 꺼낼 때뿐이니, 그때만 있는 자리인지 봅니다.

확인 문제

1. 예제의 1번 줄을 phone = '010-9876-5432'⁠로 바꿨습니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.

phone = '010-9876-5432'
head = phone[:4]
tail = phone[-4:]
masked = f'{head}****-{tail}'
print(masked)
print(phone)
힌트

글자마다 번호를 적어 보세요. 6번 줄이 찍는 phone이 어느 값에 붙어 있는지도 보세요.

정답
실행 결과
010-****-5432
010-9876-5432

앞 네 글자 '010-'와 뒤 네 글자 '5432' 사이에 '****-'가 들어갑니다. phone은 바뀌지 않아 둘째 줄은 처음 번호 그대로입니다.

흔한 오답은 둘째 줄도 010-****-5432로 쓴 답입니다. 가린 새 문자열을 만들면 phone도 그 값으로 바뀐다고 본 것입니다. 자르기와 f-문자열은 새 문자열을 만들 뿐 phone은 그대로입니다.

2. 날짜에서 월 '10'만 꺼내 찍도록 빈칸에 들어갈 자르기 번호를 쓰세요.

date = '2026-10-15'
print(date[____])
힌트

글자마다 번호를 적어 보세요. '10'의 1은 몇 번 자리이고, 끝 번호는 어디의 번호여야 할까요?

정답

5:7입니다.

date = '2026-10-15'
print(date[5:7])
실행 결과
10

'1'이 5번, '0'이 6번이라 6번까지 꺼내려면 끝 번호는 그다음 7입니다.

2절의 뒤에서 센 번호로 -5:-3이라 써도 '10'을 꺼냅니다. 앞뒤를 섞은 5:-3과 -5:7도 같습니다.

흔한 오답은 5:6입니다. 끝 번호의 글자도 든다고 본 것입니다(끝도 든다는 생각). 5:6은 '1' 한 글자만 꺼냅니다.

3. 학번 앞 네 자리는 입학 연도, 그다음 세 자리는 학과 번호입니다. 무엇이 찍힐까요? 세 줄을 글자 그대로 쓰세요.

sid = '20261057'
year = sid[:4]
num = sid[4:7]
print(year)
print(num)
print(sid[-1])
힌트

여덟 글자에 0~7번을 붙여 보세요. [4:7]의 끝 번호 7이 어느 글자인지도 보세요.

정답
실행 결과
2026
105
7

[:4]는 0~3번 '2026', [4:7]은 4~6번 '105', [-1]은 마지막 글자 '7'입니다.

흔한 오답은 둘째 줄의 1057입니다. 7번 자리까지 든다고 본 것입니다(끝도 든다는 생각).

아래 3절 코드의 2번 줄 [1:3]을 [2:5]로 바꾸면 찍히는 글자를 봅니다.

처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로