# 파이썬 문자열: split, replace, strip, join, 슬라이싱과 f-문자열

URL: https://skillaria.top/ko/guides/python/python-strings

파이썬의 문자열(str)은 변경할 수 없는 유니코드 문자열입니다. split()은 문자열을 리스트로 나누고, join()은 리스트를 다시 합치며, replace()는 부분 문자열을 바꾸고, strip()은 양끝의 공백을 지웁니다. 모든 메서드는 원본을 바꾸지 않고 새 문자열을 반환합니다. 값을 넣을 때는 f-문자열이 가장 편합니다: f"{name}: {price:.2f}".

파이썬 프로그램은 어디서나 문자열을 다룹니다. 사용자 입력, 파일 이름, CSV 줄, API 응답이 모두 문자열입니다. `str` 타입은 텍스트를 유니코드로 저장하므로 한글과 이모지도 별도 설정 없이 잘 동작합니다. 가장 자주 쓰는 메서드는 `split`, `replace`, `strip`, `join`이고, 값을 출력할 때는 f-문자열이 가장 편합니다. 예제로 하나씩 살펴보겠습니다.

## 파이썬 문자열의 구조

문자열은 작은따옴표나 큰따옴표로 씁니다. 둘의 차이는 없어서 `'커피'`와 `"커피"`는 같습니다. 세 개의 따옴표로 감싸면 여러 줄 문자열이 되고, 줄바꿈이 그대로 유지됩니다.

```
name = "커피"
note = """첫 번째 줄
두 번째 줄"""
print(len(name))  # 2 — 문자 개수
```

문자열의 가장 중요한 성질은 변경할 수 없다는 점입니다. 메서드는 문자열을 바꾸지 않고 새 문자열을 반환합니다. 그래서 `s.replace("a", "b")`만 쓰고 결과를 저장하지 않으면 아무 일도 일어나지 않습니다. `s = s.replace("a", "b")`라고 써야 합니다. 초보자가 가장 많이 하는 실수입니다.

### 이스케이프 문자, 줄바꿈, 원시 문자열

줄바꿈은 `\n`, 탭은 `\t`, 백슬래시 자체는 `\\`로 씁니다. 앞에 `r`을 붙이면 원시 문자열(raw string)이 되어 백슬래시를 그대로 둡니다. Windows 경로나 정규식에 편리합니다.

```
print("합계:\n350원")
path = r"C:\new\table.csv"   # \n과 \t가 특수 문자로 바뀌지 않습니다
```

긴 문장은 괄호로 감싸 여러 줄로 나눌 수 있습니다. 괄호 안에서 붙어 있는 문자열 리터럴은 파이썬이 자동으로 이어 붙입니다.

## split: 문자열을 리스트로 나누기

`split()`은 구분자를 기준으로 문자열을 잘라 리스트로 돌려줍니다. 인수를 주지 않으면 모든 공백 문자로 나누며, 연속된 공백은 하나로 취급합니다. 명령어를 파싱할 때 편리합니다.

```
"add  커피 250".split()        # ['add', '커피', '250']
"2026-10-16".split("-")        # ['2026', '10', '16']
"a,b,,c".split(",")            # ['a', 'b', '', 'c']
"key=value=x".split("=", 1)    # ['key', 'value=x']
```

차이를 주의하세요. 구분자를 직접 지정하면 빈 조각도 그대로 남습니다. 두 번째 인수 `maxsplit`은 자르는 횟수를 제한하고, `rsplit()`은 오른쪽에서부터 자릅니다. 텍스트를 줄 단위로 나눌 때는 `splitlines()`를 쓰세요. `\n`과 `\r\n`을 모두 인식하고, 마지막 빈 요소를 만들지 않습니다.

```
text = "커피\n택시\n"
text.split("\n")     # ['커피', '택시', '']
text.splitlines()    # ['커피', '택시']
```

## join: 리스트를 문자열로 합치기

`join()`은 split의 반대입니다. 구분자 문자열에서 호출하고, 인수로 문자열 리스트를 받습니다.

```
items = ["커피", "택시", "점심"]
print(", ".join(items))   # 커피, 택시, 점심
print("\n".join(items))   # 항목마다 새 줄에 출력
```

모든 요소는 문자열이어야 합니다. 그렇지 않으면 `TypeError: sequence item 0: expected str instance, int found`가 납니다. 숫자는 먼저 변환하세요: `", ".join(str(x) for x in amounts)`.

### 문자열 연결과 결합

두 문자열은 `+`로 붙이고, `*`로 반복할 수 있습니다: `"-" * 20`. 하지만 반복문 안에서 `+=`로 수백 개의 조각을 이어 붙이면 매번 새 문자열이 만들어져 느립니다. 조각들을 리스트에 모은 뒤 `join()`으로 한 번에 합치세요. 문자열과 숫자는 `+`로 바로 합칠 수 없습니다. `"합계: " + 5`는 `TypeError`를 냅니다. `str()`을 쓰거나 f-문자열을 사용하세요.

## replace: 부분 문자열 바꾸기

`replace(old, new)`는 나타나는 모든 부분 문자열을 바꿉니다. 세 번째 인수로 바꿀 횟수를 제한할 수 있습니다.

```
price = "1 250,50"
price = price.replace(" ", "").replace(",", ".")
print(float(price))                  # 1250.5

"가-나-다".replace("-", "+", 1)      # '가+나-다'
```

이 메서드는 대소문자를 구분하고, 정확히 일치하는 부분만 찾습니다. '모든 숫자'처럼 패턴으로 바꾸려면 `re` 모듈의 `re.sub()`을 써야 합니다.

## strip, lstrip, rstrip: 양끝 잘라내기

`strip()`은 양쪽 끝의 공백, 탭, 줄바꿈을 지웁니다. `lstrip()`은 왼쪽만, `rstrip()`은 오른쪽만 지웁니다. 사용자 입력이나 파일의 줄을 처리할 때 가장 먼저 하는 작업입니다.

```
raw = "  커피 \n"
raw.strip()       # '커피'
raw.rstrip()      # '  커피'
"xx커피xx".strip("x")   # '커피'
```

인수는 부분 문자열이 아니라 문자들의 집합입니다. `"abc텍스트cba".strip("abc")`는 양끝에 있는 a, b, c를 순서와 상관없이 모두 지웁니다. 정확히 접두사나 접미사만 떼고 싶다면 Python 3.9부터 쓸 수 있는 `removeprefix()`와 `removesuffix()`를 사용하세요.

## 그 밖의 유용한 문자열 메서드

| 메서드 | 하는 일 | 예시 → 결과 |
| --- | --- | --- |

| `lower()`, `upper()` | 대소문자 변환 | `"Python".lower()` → `'python'` |

| `startswith()`, `endswith()` | 시작과 끝 확인 | `"a.csv".endswith(".csv")` → `True` |

| `find()` | 부분 문자열의 위치, 없으면 -1 | `"가나다".find("나")` → `1` |

| `count()` | 나타나는 횟수 | `"바나나".count("나")` → `2` |

| `isdigit()` | 숫자로만 이루어졌는지 | `"250".isdigit()` → `True` |

| `zfill()` | 앞을 0으로 채우기 | `"7".zfill(3)` → `'007'` |

문자열에 특정 부분이 들어 있는지는 `in` 연산자로 가장 간단히 확인합니다: `if "커피" in text:`. 문자열끼리의 `==` 비교는 글자 단위이며 대소문자를 구분합니다. 대소문자를 무시하고 비교하려면 두 문자열을 `casefold()`로 바꾸세요.

## 문자열 슬라이싱

문자열은 시퀀스이므로 인덱스로 글자에 접근할 수 있습니다. 인덱스는 0부터 세고, 음수 인덱스는 끝에서부터 셉니다. 슬라이스 `s[start:stop:step]`은 부분 문자열을 반환하며, 끝 값은 포함되지 않습니다.

```
s = "Python"
s[0]      # 'P'
s[-1]     # 'n'
s[0:3]    # 'Pyt'
s[2:]     # 'thon'
s[::2]    # 'Pto'
s[::-1]   # 'nohtyP' — 문자열 뒤집기
```

슬라이스는 범위를 벗어나도 오류를 내지 않습니다. `s[0:100]`은 문자열 전체를 반환합니다. 하지만 `s[100]`은 `IndexError`입니다. 인덱스로 글자를 바꿀 수는 없습니다(`s[0] = "J"`는 `TypeError`). 새 문자열을 만들어야 합니다: `"J" + s[1:]`.

## 파이썬 f-문자열

문자열 앞에 `f`를 붙이면 중괄호 안의 식이 계산되어 텍스트에 들어갑니다. Python 3.6부터 쓸 수 있는 기본 서식 방법입니다. `format()`보다 짧고, 예전 `%` 연산자보다 읽기 쉽습니다.

```
item = "커피"
price = 250
print(f"{item}: {price}원")              # 커피: 250원
print(f"할인 후: {price * 0.9}원")        # 할인 후: 225.0원
print(f"{item=}")                         # item='커피' — 디버깅할 때 편리합니다
```

### 숫자 서식과 정렬

중괄호 안에서 콜론 뒤에 서식 지정자를 씁니다. 반올림, 자릿수 구분, 너비, 정렬을 정할 수 있습니다.

| 작성 | 결과 | 의미 |
| --- | --- | --- |

| `f"{3.14159:.2f}"` | `3.14` | 소수점 둘째 자리까지 반올림 |

| `f"{1250000:,}"` | `1,250,000` | 자릿수 쉼표 |

| `f"{1250000:_}"` | `1_250_000` | 쉼표 대신 밑줄 |

| `f"{0.256:.1%}"` | `25.6%` | 백분율 |

| `f"{'커피':<10}|"` | `커피 |` | 왼쪽 정렬, 너비 10 |

| `f"{250:>8}"` | ` 250` | 오른쪽 정렬 |

| `f"{7:03d}"` | `007` | 0으로 채우기 |

정렬은 터미널에 표를 출력할 때 유용합니다. `f"{name:<12}{amount:>10.2f}"`처럼 쓰면 열이 정확히 맞춰집니다. 서식은 출력할 때만 적용하세요. 금액은 `float`보다 원 단위 정수(`int`)나 `Decimal`로 저장하는 것이 안전합니다. `0.1 + 0.2`는 `0.30000000000000004`가 되기 때문입니다.

### f-문자열 안의 따옴표와 줄바꿈

Python 3.12부터(PEP 701) f-문자열은 정식 문법을 갖게 되었습니다. 중괄호 안에서 바깥과 같은 따옴표를 쓸 수 있고, 백슬래시와 줄바꿈도 허용되며, 중첩 깊이에도 제한이 없습니다. 중괄호 안의 오류도 정확한 위치를 보여 줍니다. 예전 버전에서는 안쪽에 다른 종류의 따옴표를 쓰세요: `f"{d['key']}"`. 줄바꿈은 별도의 변수를 쓰거나 `chr(10)`을 사용하세요.

여러 줄 텍스트는 세 개의 따옴표로 감싼 f-문자열이 적합합니다: `f"""합계: {total}\n항목 수: {count}"""`.

### format()과 %: 예전 방식

오래된 코드에서는 `"{}: {}".format(item, price)`나 `"%s: %d" % (item, price)`를 볼 수 있습니다. `format()`의 지정자는 f-문자열과 같습니다. 서식 문자열을 데이터와 분리해 보관해야 할 때, 예를 들어 설정 파일에 둘 때는 `format()`이 여전히 유용합니다.

## 실전 예제: 문자열 파싱

여러 메서드를 함께 써 봅시다. 파일에서 `"  2026-10-16; 커피 ; 250,50 \n"` 같은 줄을 읽어 날짜, 항목 이름, 금액(원 단위)을 얻어야 한다고 가정하겠습니다. 순서는 보통 이렇습니다. 양끝을 정리하고, 구분자로 나누고, 각 조각을 다듬고, 타입을 바꿉니다.

```
line = "  2026-10-16; 커피 ; 250,50 \n"

date, item, raw_amount = [p.strip() for p in line.strip().split(";")]
amount_kop = round(float(raw_amount.replace(",", ".")) * 100)

print(date, item, amount_kop)            # 2026-10-16 커피 25050
print(f"{item:10.2f}")
```

조각이 세 개가 아니면 언패킹 단계에서 `ValueError: not enough values to unpack` 또는 `too many values to unpack`이 납니다. 실제 코드에서는 이런 줄을 미리 검사하거나 예외를 잡으세요. 따옴표와 이스케이프가 있는 진짜 CSV 파일은 `split`보다 표준 모듈 `csv`로 읽는 것이 안전합니다.

### 문자열에서 자주 하는 실수

- **메서드 결과를 저장하지 않음**: `s.strip()`만 쓰면 `s`는 바뀌지 않습니다.
- **숫자 리스트에 join 사용** — `TypeError`가 납니다. 먼저 `map(str, ...)`을 쓰세요.
- **strip에 부분 문자열 전달**: 인수는 문자들의 집합입니다. 접두사를 떼려면 `removeprefix()`를 쓰세요.
- **대소문자를 구분한 비교**: `"Coffee" == "coffee"`는 `False`입니다.
- **Windows 경로에서 r 접두사 생략**: 백슬래시가 특수 문자로 해석됩니다.

## t-문자열: 완성된 텍스트 대신 템플릿

Python 3.14에는 t-문자열이 추가되었습니다. f-문자열과 비슷하지만 앞에 `t`를 붙이고, 결과는 완성된 문자열이 아니라 `string.templatelib.Template` 객체입니다. 이 객체에는 텍스트 조각(`.strings`)과 삽입된 값(`.values`)이 따로 들어 있습니다.

```
name = ""
tpl = t"안녕하세요, {name}님!"
print(tpl.strings)   # ('안녕하세요, ', '님!')
print(tpl.values)    # ('',)
```

이것이 왜 유용할까요? 라이브러리가 값을 합치기 전에 받을 수 있어서, HTML에서 꺾쇠괄호를 이스케이프하거나 SQL 쿼리의 매개변수를 안전하게 넘길 수 있습니다. f-문자열은 이미 합쳐 버리기 때문에 이런 기회가 없습니다. 일반적인 출력에는 여전히 f-문자열을 쓰세요.

## 정리

일상적인 문자열 작업에는 몇 가지 도구면 충분합니다. `split()`과 `join()`으로 텍스트를 나누고 합치고, `strip()`으로 입력을 다듬고, `replace()`로 조각을 바꾸고, 슬라이스로 부분을 잘라내고, f-문자열로 원하는 서식의 값을 출력합니다. 문자열은 변경할 수 없다는 점을 기억하세요. 메서드는 새 문자열을 반환하므로 결과를 저장해야 합니다. 이 내용은 지출 관리기를 만들며 강의에서 실습으로 다룹니다.

## FAQ

**파이썬에서 문자열 길이는 어떻게 구하나요?**

len(s)는 문자 개수를 반환합니다. 한글과 이모지도 유니코드 문자 단위로 셉니다. 바이트 크기가 필요하면 len(s.encode("utf-8"))을 쓰세요.

**숫자를 문자열로, 문자열을 숫자로 바꾸려면?**

str(250)은 '250'을, int("250")과 float("2.5")는 반대 방향 변환을 합니다. 숫자 형태가 아닌 문자열을 int()에 넣으면 ValueError가 나므로 입력을 먼저 검사하세요.

**replace를 썼는데 문자열이 바뀌지 않아요.**

문자열은 변경할 수 없고 replace는 새 문자열을 반환합니다. 결과를 다시 저장하세요: s = s.replace("a", "b").

**문자열이 비어 있는지 어떻게 확인하나요?**

빈 문자열은 거짓이므로 if not s:로 확인하면 됩니다. 공백만 있는 경우까지 걸러내려면 if not s.strip():을 사용하세요.

**t-문자열과 f-문자열은 어떻게 다른가요?**

f-문자열은 바로 str을 반환하지만, t-문자열(Python 3.14 이상)은 텍스트 조각과 값을 따로 담은 Template 객체를 반환합니다. 이 덕분에 HTML이나 SQL에 넣을 데이터를 안전하게 처리할 수 있습니다.


---
Source: Skillaria.Top (https://skillaria.top)
