🌱
기초 (Basic)
메서드 · split/join · f-string 심화 · 이스케이프
8주차 — 문자열 다루기
문자열 인덱싱/슬라이싱, 자주 쓰는 메서드(split/join/strip/replace), f-string 심화(정렬·자릿수·진법), 이스케이프 문자(\n \t)를 익힙니다.
stringsplitjoinf-string
소요 시간
⏱ 2시간
난이도
📊 완전 초보
선수 조건
🎯 7주차
결과물
회문/이메일 검증/텍스트 통계 같은 문자열 처리 프로그램
이 강의에서 배우는 것
- 1문자열 인덱싱·슬라이싱
- 2자주 쓰는 메서드 (split, join, strip, replace 등)
- 3f-string 심화 (정렬·자릿수)
- 4이스케이프 문자 (\n, \t)
1. 문자열 기초
문자열은 변경 불가능(immutable). 인덱싱과 슬라이싱은 리스트와 동일.
python
s = "Python"
print(s[0]) # P
print(s[-1]) # n
print(s[1:4]) # yth
print(len(s)) # 6
# s[0] = "X" # TypeError — 변경 불가2. 자주 쓰는 메서드
| 메서드 | 동작 | 예시 |
|---|---|---|
| lower() / upper() | 소/대문자 | "Hi".upper() → "HI" |
| strip() | 양쪽 공백 제거 | " hi ".strip() → "hi" |
| lstrip() / rstrip() | 좌/우 공백 제거 | |
| split(sep) | 분리 → 리스트 | "a,b,c".split(",") → ["a","b","c"] |
| join(seq) | 리스트 → 문자열 | ",".join(["a","b"]) → "a,b" |
| replace(old, new) | 치환 | "foo".replace("o", "*") → "f**" |
| find(x) / index(x) | 위치 찾기 | "hello".find("l") → 2 |
| count(x) | 개수 | "hello".count("l") → 2 |
| startswith / endswith | 시작/끝 검사 | "abc".endswith("c") → True |
| isdigit / isalpha | 숫자/문자 검사 |
3. f-string 심화
python
name = "Alice"
score = 92.345
print(f"{name:<10}|") # 좌측 정렬 폭 10
print(f"{name:>10}|") # 우측 정렬
print(f"{name:^10}|") # 가운데
print(f"{name:*^10}|") # 채움 문자 * 가운데
print(f"{score:.2f}") # 92.35 (소수점 둘째)
print(f"{1234567:,}") # 1,234,567 (천 단위 콤마)
print(f"{0.85:.0%}") # 85%
print(f"{255:b} {255:x}") # 2진수, 16진수4. 이스케이프 문자
| 표기 | 의미 |
|---|---|
| \n | 줄바꿈 |
| \t | 탭 |
| \\ | 백슬래시 |
| \" | 큰따옴표 |
| \' | 작은따옴표 |
python
print("줄1\n줄2") # 두 줄
print("이름\t나이") # 탭으로 구분
print("경로: C:\\dev") # C:\dev
# raw string: 이스케이프 무시
print(r"C:\dev\new") # C:\dev\new5. 문자열 ↔ 리스트 변환
python
csv = "사과,바나나,포도"
fruits = csv.split(",") # ['사과', '바나나', '포도']
joined = " | ".join(fruits) # "사과 | 바나나 | 포도"6. 자주 하는 실수
1) 문자열 원본을 수정하려 함
python
s = "hello"
s.replace("l", "L") # s는 그대로!
s = s.replace("l", "L") # 결과를 다시 할당2) split() 인자 누락
"a b c".split() 은 공백 분리. "a,b".split() 은 분리 안 됨.
3) find vs index
find 는 없으면 -1, index 는 ValueError.
4) 따옴표 안에 같은 따옴표
python
s = "say "hi"" # SyntaxError
s = 'say "hi"' # OK
s = "say \"hi\"" # OK5) f-string 중괄호 출력
python
print(f"{name}") # 변수
print(f"{{name}}") # 그냥 {name} 출력7. FAQ
Q1. 문자열 길이는 한글도 1글자로?
len() 은 코드 포인트 단위라 보통 1글자. 이모지·결합문자는 예외 있음.
Q2. 대소문자 무시 비교는?
s1.lower() == s2.lower() 또는 s1.casefold() == s2.casefold() (더 정확).
Q3. 문자열 안에 변수 값을 넣는 방법이 여럿?
옛 방식: %, .format(). 현재 권장: f-string (가장 빠르고 가독성 좋음).
💻 예제 (examples)
실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.
01_methods.py— 자주 쓰는 메서드 모음
CODE
s = " Hello, World! "
print(s.strip()) # "Hello, World!"
print(s.upper()) # " HELLO, WORLD! "
print(s.lower()) # " hello, world! "
print(s.replace("World", "Python")) # " Hello, Python! "
print("hello".startswith("he")) # True
print("hello".endswith("lo")) # True
print("123".isdigit()) # True
print("abc".isalpha()) # True
▶ 실행 결과
Hello, World!
HELLO, WORLD!
hello, world!
Hello, Python!
True
True
True
True02_split_join.py— split / join 패턴
CODE
# split
csv = "사과,바나나,포도"
fruits = csv.split(",")
print(fruits)
words = "Hello World Python".split() # 공백 분리
print(words)
# join
joined = " | ".join(fruits)
print(joined)
print("-".join(["010", "1234", "5678"]))
▶ 실행 결과
['사과', '바나나', '포도']
['Hello', 'World', 'Python']
사과 | 바나나 | 포도
010-1234-567803_fstring_format.py— f-string 정렬·자릿수·진법
CODE
name = "Alice"
score = 92.345
print(f"{name:<10}|")
print(f"{name:>10}|")
print(f"{name:^10}|")
print(f"{name:*^10}|")
print(f"{score:.2f}")
print(f"{1234567:,}")
print(f"{0.85:.0%}")
print(f"{255:b} {255:x}")
▶ 실행 결과
Alice |
Alice|
Alice |
**Alice***|
92.35
1,234,567
85%
11111111 ff04_escape.py— 이스케이프 + raw string
CODE
print("줄1\n줄2")
print("이름\t나이")
print("경로: C:\\dev\\app")
# raw string
print(r"C:\dev\new")
# 따옴표 안의 따옴표
print("she said \"hi\"")
print('she said "hi"')
▶ 실행 결과
줄1
줄2
이름 나이
경로: C:\dev\app
C:\dev\new
she said "hi"
she said "hi"📝 과제 (exercises)
직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.
과제 1
회문(palindrome) 판별
목표: 입력 문자열이 앞뒤가 같은지 확인한다.
요구사항
- 공백, 대소문자 무시
- 회문이면 "회문입니다", 아니면 "회문이 아닙니다"
입출력 예시
문자열: 기러기
회문입니다
문자열: A man a plan a canal Panama
회문입니다▶정답 코드 펼치기 / 접기
SOLUTION
s = input("문자열: ")
clean = s.replace(" ", "").lower()
if clean == clean[::-1]:
print("회문입니다")
else:
print("회문이 아닙니다")
▶ 실행 결과
문자열: A man a plan a canal Panama
회문입니다과제 2
이메일 형식 검증
목표: 이메일 주소가 형식에 맞는지 간단히 확인한다.
요구사항
- @ 가 정확히 1개
- . 이 @ 뒤에 1개 이상
- 공백 없음
입출력 예시
이메일: hong@example.com
유효한 이메일
이메일: foo@@bar.com
잘못된 형식▶정답 코드 펼치기 / 접기
SOLUTION
email = input("이메일: ")
if " " in email:
print("잘못된 형식 (공백)")
elif email.count("@") != 1:
print("잘못된 형식 (@ 개수)")
else:
local, domain = email.split("@")
if "." not in domain or not local:
print("잘못된 형식")
else:
print("유효한 이메일")
▶ 실행 결과
이메일: hong@example.com
유효한 이메일과제 3
텍스트 통계
목표: 문장을 입력받아 글자 수, 단어 수, 평균 단어 길이를 출력한다.
요구사항
- 글자 수는 공백 제외
- 단어 수는 공백으로 분리한 결과
- 평균 단어 길이는 소수점 둘째 자리
입출력 예시
문장: Hello Python world
글자 수(공백 제외): 16
단어 수: 3
평균 단어 길이: 5.33▶정답 코드 펼치기 / 접기
SOLUTION
text = input("문장: ")
chars = len(text.replace(" ", ""))
words = text.split()
word_count = len(words)
avg = sum(len(w) for w in words) / word_count
print(f"글자 수(공백 제외): {chars}")
print(f"단어 수: {word_count}")
print(f"평균 단어 길이: {avg:.2f}")
▶ 실행 결과
문장: Hello Python world
글자 수(공백 제외): 16
단어 수: 3
평균 단어 길이: 5.33