파이썬 문자열 다루기
슬라이싱·검색·치환·split/join — 입문자가 매일 쓰는 6가지 패턴.
이메일 도메인만 뽑기, 전화번호에서 하이픈 제거, CSV 한 줄 잘라 필드 분리 — 일주일 안에 누구나 마주칠 작업입니다. 도구는 다 문자열 메서드 6가지 안에 있어요. 정규표현식·외부 라이브러리 없이도 텍스트 잡일 90% 가 해결됩니다. 입문자가 가장 빨리 "실무처럼" 코드를 짜는 분기점이 이 챕터.
4편을 마치면 ① 인덱스·슬라이싱으로 부분 추출 ② in 으로 검색, replace 로 치환 ③ split·join 으로 자르고 합치기 ④ strip·upper·startswith 등 자주 쓰는 메서드 8종을 손에 익힙니다.
슬라이싱 — 인덱스와 범위로 부분 추출
문자열은 글자가 줄지어 있는 배열로 생각하면 됩니다. 0번부터 번호가 붙고, 음수는 뒤에서부터 셉니다.
s = "Hello, Python!"
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13
# -7 -6 -5 -4 -3 -2 -1
s[0] # 'H' — 첫 글자
s[-1] # '!' — 마지막 글자
s[7:13] # 'Python' — 7번부터 12번까지 (13은 미포함)
s[:5] # 'Hello' — 처음부터 4번까지
s[7:] # 'Python!' — 7번부터 끝까지
s[::-1] # '!nohtyP ,olleH' — 거꾸로 (1편 미션 같은 트릭)
슬라이싱 문법은 [시작:끝:간격]. 끝 인덱스는 포함하지 않음 이 가장 헷갈리는 부분입니다. s[0:5] 가 0,1,2,3,4 번 5글자 — 끝의 5번은 제외. 이걸 알아야 다음 100번을 안 막혀요.
📌 한글도 똑같이 동작합니다
"안녕하세요"[0:2] 는 '안녕'. 파이썬 3 부터 모든 문자열이 유니코드 기본이라 한글·이모지·일본어 모두 한 글자 = 인덱스 1로 셉니다. 파이썬 2 시절의 인코딩 지옥은 사라졌어요.
검색과 치환 — in·find·replace
특정 문자열이 들어있는지 확인하려면 in 키워드. True/False 가 돌아옵니다. 위치까지 알고 싶으면 find, 바꿔치우려면 replace.
email = "[email protected]"
"@" in email # True — 존재 확인만
email.find("@") # 6 — 첫 등장 인덱스 (없으면 -1)
email.find("naver") # -1 — 없음을 의미
email.replace("junai", "naver") # '[email protected]'
# 도메인만 뽑기 — 슬라이싱 + find 조합
at = email.find("@")
domain = email[at+1:] # 'junai.ai'
replace 의 함정 — 원본을 바꾸지 않습니다. 새 문자열을 만들어 돌려줄 뿐이에요. 변경된 결과를 쓰려면 email = email.replace(...) 처럼 다시 할당해야 합니다. 문자열은 불변(immutable) — 이 성질이 모든 문자열 메서드의 공통 규칙입니다.
자르고 합치기 — split 과 join
CSV 한 줄을 처리할 때 가장 많이 쓰는 두 짝. split 은 구분자로 잘라 리스트로 만들고, join 은 리스트를 구분자로 이어 문자열로 합칩니다.
row = "준성,30,서울,개발자"
fields = row.split(",")
# ['준성', '30', '서울', '개발자'] — 리스트로 4 조각
len(fields) # 4
fields[0] # '준성'
fields[2] # '서울'
# 다시 합치기 (구분자만 바꿔서)
" | ".join(fields)
# '준성 | 30 | 서울 | 개발자'
주의 — "구분자".join(리스트) 순서가 거꾸로 같지만, "이 구분자로 리스트 사이를 이어라" 라고 읽으면 자연스럽습니다. 리스트.join(",") 이 아니에요. 파이썬에서 이 순서가 처음엔 어색하지만, 한 번 익으면 다른 언어가 답답하게 느껴집니다.
# 전화번호 하이픈 제거
phone = "010-1234-5678"
"".join(phone.split("-")) # '01012345678'
# 또는 더 짧게
phone.replace("-", "") # '01012345678'
자주 쓰는 메서드 8종 — 한 표로
| 메서드 | 하는 일 | 예시 |
|---|---|---|
upper() | 대문자 | "hi".upper() → 'HI' |
lower() | 소문자 | "HI".lower() → 'hi' |
strip() | 양끝 공백 제거 | " hi ".strip() → 'hi' |
startswith() | 시작 일치 확인 | "hello".startswith("he") → True |
endswith() | 끝 일치 확인 | "a.png".endswith(".png") → True |
count() | 등장 횟수 | "banana".count("a") → 3 |
isdigit() | 전부 숫자인가 | "123".isdigit() → True |
title() | 단어 첫 글자 대문자 | "hello world".title() → 'Hello World' |
strip("abc") 는 양끝에서 abc 중 어떤 글자든 다 빼라 는 의미지 "abc" 라는 단어를 빼라가 아닙니다. "abcXYZabc".strip("abc") = 'XYZ'. 자주 헷갈려요.
마무리 — 메서드 체이닝 한 줄로 잡일 끝
위 메서드들은 결과가 모두 문자열이라 점(.)으로 계속 이을 수 있습니다. 이걸 메서드 체이닝이라 부르고, 한 줄에 여러 작업을 압축할 때 씁니다.
# 사용자 입력 정제: 공백 제거 → 소문자 → @ 앞부분만
user = " [email protected] "
clean_id = user.strip().lower().split("@")[0]
# 'jspark'
읽는 순서대로 동작이 일어납니다. "양끝 공백을 떼고 → 전체 소문자로 → @ 로 잘라 → 첫 조각". 입문자 한 달이면 이 정도 한 줄은 자연스럽게 짭니다.
다음 미션 — REPL 에서: ① 본인 이메일 주소에서 도메인만 추출 ② "2026-05-13" 에서 연·월·일을 따로 변수에 분리 (힌트: split) ③ 파일명 "report.final.v2.pdf" 에서 확장자만 (힌트: rsplit 또는 마지막 점 위치 find).
다음 편 미리보기
5편 — "파이썬 리스트": 여러 값을 한 변수에 담는 첫 번째 자료구조. 추가·삭제·정렬·인덱스·슬라이싱이 문자열과 형제처럼 닮았습니다.
← 3편 "변수와 자료형" · 다음: 5편 "리스트 사용법"