기초

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

업데이트: · Skillaria.Top

파이썬의 문자열(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}"0070으로 채우기

정렬은 터미널에 표를 출력할 때 유용합니다. 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}{amount_kop / 100:>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 = "<script>"
tpl = t"안녕하세요, {name}님!"
print(tpl.strings)   # ('안녕하세요, ', '님!')
print(tpl.values)    # ('<script>',)

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

정리

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

자주 묻는 질문

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

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에 넣을 데이터를 안전하게 처리할 수 있습니다.

영상으로 이 주제 배우기

이 주제는 “Python 3.15: от новичка до профи” 강의에서 실습과 함께 자세히 다룹니다.

강의로 이동