← 파이썬 강의 목록으로
🌱
기초 (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\new

5. 문자열 ↔ 리스트 변환

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\""  # OK

5) 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
True
02_split_join.pysplit / 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-5678
03_fstring_format.pyf-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 ff
04_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
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗