파이썬(Python) 공부 3편
문자열(String) 완전 정복
파이썬에서 문자열은 가장 자주 다루는 자료형입니다. 텍스트 처리, 웹 스크래핑, 파일 읽기, API 응답 파싱까지 어디서나 등장합니다. 인덱싱·슬라이싱부터 수십 가지 문자열 메서드, f-string 심화, 이스케이프 문자까지 한 번에 정리합니다.
📝 문자열 선언 — 따옴표의 종류와 차이
파이썬 문자열은 작은따옴표(' '), 큰따옴표(" "), 삼중 따옴표(''' ''' 또는 """ """) 세 가지 방식으로 만들 수 있습니다. 기능상 차이는 없으나 각각 유용한 상황이 있습니다.
# 작은따옴표 / 큰따옴표 — 기능 동일
s1 = 'Hello'
s2 = "World"
# 따옴표 안에 다른 종류 따옴표 사용 가능
s3 = "It's a beautiful day" # 작은따옴표 포함
s4 = 'He said "Hello"' # 큰따옴표 포함
# 삼중 따옴표 — 여러 줄 문자열, 줄바꿈 그대로 유지
multiline = """파이썬은
배우기 쉽고
쓸 곳이 많다."""
print(multiline)
# 문자열 길이 — len()
print(len("Hello")) # 5
print(len("파이썬")) # 3 (한글도 한 글자 = 1)
# 문자열 반복과 연결
print("Ha" * 3) # HaHaHa
print("Hello" + " " + "World") # Hello World
⌨ 이스케이프 문자 — 특수 문자를 문자열에 넣기
백슬래시(\)로 시작하는 특수 문자 표현을 이스케이프 문자(Escape Character)라고 합니다.
| 이스케이프 | 의미 | 예시 | 출력 결과 |
|---|---|---|---|
| \n | 줄바꿈 (newline) | print("a\nb") | a b |
| \t | 탭 (tab) | print("a\tb") | a b |
| \\ | 백슬래시 자체 | print("C:\\Users") | C:\Users |
| \' | 작은따옴표 | print('It\'s') | It's |
| \" | 큰따옴표 | print("say \"hi\"") | say "hi" |
| r"..." | raw string (\ 무시) | r"C:\new\test" | C:\new\test |
문자열 앞에 r을 붙이면 백슬래시를 이스케이프로 처리하지 않고 그대로 출력합니다. Windows 파일 경로나 정규표현식 패턴 작성 시 자주 활용됩니다.
- print("C:\new\test") → C:(줄바꿈)ew(탭)est ← 의도치 않은 결과
- print(r"C:\new\test") → C:\new\test ← raw string으로 해결
🔍 인덱싱(Indexing) — 특정 위치의 문자 꺼내기
파이썬 문자열은 각 문자마다 인덱스(위치 번호)가 있습니다. 앞에서부터는 0부터 시작하고, 뒤에서부터는 -1부터 시작합니다.
s = "Hello, Python!"
파란색: s[0]='H', s[-1]='!' | 위쪽: 양수 인덱스 | 아래쪽: 음수 인덱스
s = "Hello, Python!"
# 양수 인덱스 (앞에서부터, 0 시작)
print(s[0]) # H
print(s[1]) # e
print(s[7]) # P
# 음수 인덱스 (뒤에서부터, -1 시작)
print(s[-1]) # ! (마지막 문자)
print(s[-2]) # n
print(s[-7]) # P
# 범위 초과 → IndexError 발생 주의
# print(s[100]) → IndexError!
✂ 슬라이싱(Slicing) — 문자열 자르기
슬라이싱은 s[start : end : step] 형식으로 문자열의 일부를 잘라냅니다. end 인덱스의 문자는 포함되지 않습니다(end-1까지 포함).
s = "Hello, Python!"
# 기본 슬라이싱 s[start:end] (end 미포함)
print(s[0:5]) # Hello (0,1,2,3,4번 인덱스)
print(s[7:13]) # Python
# start 생략 → 처음부터
print(s[:5]) # Hello
# end 생략 → 끝까지
print(s[7:]) # Python!
# 전체 복사
print(s[:]) # Hello, Python!
# step 사용 s[start:end:step]
print(s[0:10:2]) # Hlo P (2칸씩 건너뜀)
print(s[::2]) # Hlo yhn (전체에서 2칸씩)
# step = -1 → 문자열 뒤집기 (역순)
print(s[::-1]) # !nohtyP ,olleH
# 음수 인덱스 슬라이싱
print(s[-7:-1]) # Python
- end 인덱스는 포함 안 됨: s[0:5]는 0,1,2,3,4번 → 5번 인덱스 제외
- 범위 초과해도 오류 없음: s[0:100]은 문자열 끝까지만 반환 (인덱싱과 다름)
- s[::-1]로 문자열 뒤집기: 파이썬에서 문자열을 뒤집는 가장 간단한 방법
🔨 문자열 메서드 총정리 — 자주 쓰는 것만 제대로
파이썬 문자열에는 수십 가지 내장 메서드가 있습니다. 메서드는 원본 문자열을 변경하지 않고 새 문자열을 반환합니다. 문자열은 불변(immutable) 객체이기 때문입니다.
s = "hello, Python World"
print(s.upper()) # HELLO, PYTHON WORLD
print(s.lower()) # hello, python world
print(s.capitalize()) # Hello, python world (첫 글자만 대문자)
print(s.title()) # Hello, Python World (각 단어 첫 글자 대문자)
print(s.swapcase()) # HELLO, pYTHON wORLD (대소문자 반전)
s = " Hello, World! "
print(s.strip()) # "Hello, World!" (양쪽 공백 제거)
print(s.lstrip()) # "Hello, World! " (왼쪽만)
print(s.rstrip()) # " Hello, World!" (오른쪽만)
# 특정 문자 제거도 가능
s2 = "###Python###"
print(s2.strip("#")) # Python
s = "Hello, Python! Python is great."
# 포함 여부 (가장 자주 쓰임)
print("Python" in s) # True
print("Java" not in s) # True
# 위치 찾기
print(s.find("Python")) # 7 (처음 등장 위치, 없으면 -1)
print(s.rfind("Python")) # 15 (마지막 등장 위치)
print(s.index("Python")) # 7 (없으면 ValueError!)
print(s.count("Python")) # 2 (등장 횟수)
# 시작/끝 확인
print(s.startswith("Hello")) # True
print(s.endswith("great.")) # True
# split() — 문자열을 리스트로 분리 (실무에서 매우 자주 사용)
csv = "apple,banana,cherry"
print(csv.split(",")) # ['apple', 'banana', 'cherry']
sentence = "Hello World Python"
print(sentence.split()) # ['Hello', 'World', 'Python'] (기본: 공백)
print(sentence.split(" ", 1)) # ['Hello', 'World Python'] (1번만 분리)
# splitlines() — 줄바꿈 기준으로 분리
multi = "line1\nline2\nline3"
print(multi.splitlines()) # ['line1', 'line2', 'line3']
# join() — 리스트를 문자열로 결합
words = ["apple", "banana", "cherry"]
print(", ".join(words)) # apple, banana, cherry
print("-".join(words)) # apple-banana-cherry
print("".join(words)) # applebananacherry
# replace() — 문자열 교체
s = "Hello World World"
print(s.replace("World", "Python")) # Hello Python Python (전체)
print(s.replace("World", "Python", 1)) # Hello Python World (1번만)
# 정렬 (고정 폭 출력 시 유용)
print("Hi".ljust(10)) # "Hi " (왼쪽 정렬, 10칸)
print("Hi".rjust(10)) # " Hi" (오른쪽 정렬)
print("Hi".center(10)) # " Hi " (가운데 정렬)
print("Hi".center(10, "*")) # "****Hi****" (채울 문자 지정)
# 검사 메서드
print("123".isdigit()) # True (모두 숫자?)
print("abc".isalpha()) # True (모두 알파벳?)
print("abc123".isalnum()) # True (알파벳+숫자?)
print(" ".isspace()) # True (모두 공백?)
print("Hello".isupper()) # False (모두 대문자?)
| 메서드 | 설명 | 반환값 |
|---|---|---|
| upper() / lower() | 전체 대문자 / 소문자 변환 | str |
| strip() / lstrip() / rstrip() | 양쪽 / 왼쪽 / 오른쪽 공백(문자) 제거 | str |
| find(sub) / rfind(sub) | 부분 문자열 위치 (없으면 -1) | int |
| count(sub) | 부분 문자열 등장 횟수 | int |
| replace(old, new) | 문자열 교체 | str |
| split(sep) | 구분자로 분리 → 리스트 | list |
| sep.join(list) | 리스트를 sep으로 결합 | str |
| startswith() / endswith() | 시작 / 끝 문자열 확인 | bool |
| isdigit() / isalpha() / isalnum() | 숫자 / 알파벳 / 알파벳+숫자 여부 | bool |
| zfill(n) | 왼쪽에 0을 채워 n자리로 만들기 | str |
🆕 f-string 심화 — 형식 지정자까지
f-string은 파이썬 3.6부터 도입된 문자열 포매팅 방법으로, 가독성과 성능 면에서 가장 권장되는 방식입니다. 중괄호 안에 변수나 표현식, 형식 지정자를 함께 사용할 수 있습니다.
name = "Alice"
score = 95.678
count = 1234567
# 기본 사용
print(f"이름: {name}, 점수: {score}")
# 이름: Alice, 점수: 95.678
# 표현식 직접 사용
print(f"10 + 20 = {10 + 20}") # 10 + 20 = 30
print(f"이름 길이: {len(name)}") # 이름 길이: 5
print(f"대문자: {name.upper()}") # 대문자: ALICE
# 소수점 자리수 지정 :.2f
print(f"점수: {score:.2f}") # 점수: 95.68 (소수 2자리)
print(f"점수: {score:.0f}") # 점수: 96 (반올림 정수)
# 천 단위 구분자 :,
print(f"인구: {count:,}") # 인구: 1,234,567
# 너비 및 정렬 지정
print(f"{name:<10}") # "Alice " (왼쪽 정렬, 10칸)
print(f"{name:>10}") # " Alice" (오른쪽 정렬)
print(f"{name:^10}") # " Alice " (가운데 정렬)
print(f"{name:*^10}") # **Alice*** (*로 채움)
# 2진수, 16진수 변환
print(f"{255:b}") # 11111111 (2진수)
print(f"{255:x}") # ff (16진수)
print(f"{255:X}") # FF (대문자 16진수)
# Python 3.8+ — = 디버깅 출력
print(f"{score=}") # score=95.678 (변수명까지 출력)
파이썬에는 문자열 포매팅 방법이 3가지 있습니다. 현재는 f-string(방법 3)을 사용하는 것이 표준입니다.
name, score = "Alice", 95
# 방법 1: % 포맷 (오래된 방식)
print("이름: %s, 점수: %d" % (name, score))
# 방법 2: .format() (Python 2.6+)
print("이름: {}, 점수: {}".format(name, score))
# 방법 3: f-string (Python 3.6+, 가장 권장)
print(f"이름: {name}, 점수: {score}")
📝 3편 실습 문제
- s = "Python Programming"
- 슬라이싱으로 "Python"만 추출하기
- 슬라이싱으로 "Programming"만 추출하기
- 문자열을 뒤집어서 출력하기 ("gnimmargorP nohtyP")
- 홀수 번째 인덱스 문자만 출력하기 ("yhoPormig")
- email = " User@EXAMPLE.COM "
- 양쪽 공백 제거 후 모두 소문자로 변환 → "user@example.com"
- @ 기준으로 분리해서 아이디와 도메인 각각 출력
- 도메인에서 "."의 개수 세기
# 실습 1
s = "Python Programming"
print(s[:6]) # Python
print(s[7:]) # Programming
print(s[::-1]) # gnimmargorP nohtyP
print(s[1::2]) # yhoPormig
# 실습 2
email = " User@EXAMPLE.COM "
cleaned = email.strip().lower()
print(cleaned) # user@example.com
parts = cleaned.split("@")
print(f"아이디: {parts[0]}") # 아이디: user
print(f"도메인: {parts[1]}") # 도메인: example.com
print(f"점 개수: {parts[1].count('.')}") # 점 개수: 1
- 문자열 선언: 작은따옴표·큰따옴표·삼중 따옴표 / 불변(immutable) 객체
- 이스케이프: \n(줄바꿈) \t(탭) \\(백슬래시) / r"..."으로 raw string
- 인덱싱: s[0](첫 문자) s[-1](마지막) / 0부터 시작 / 음수 인덱스 지원
- 슬라이싱: s[start:end:step] / end는 미포함 / s[::-1]로 뒤집기
- 주요 메서드: upper/lower/strip/find/replace/split/join/startswith/count
- 메서드 특징: 원본 변경 없이 새 문자열 반환 (문자열은 불변)
- f-string: f"{변수:.2f}" f"{변수:,}" f"{변수:>10}" 형식 지정자 활용
- in 연산자: "sub" in s로 포함 여부 확인 — 가독성 높고 자주 사용
비교 연산자 / 논리 연산자 / 중첩 조건문 / 삼항 연산자 / match-case(3.10+)