문자열
여러분이 작성하는 거의 모든 프로그램에 텍스트가 등장합니다. 이름, 메시지, 점수, 라벨 등이죠. 파이썬에서는 어떤 텍스트든 문자열이라고 부릅니다. 따옴표로 감싼 모든 값이 문자열이에요. 작은따옴표든 큰따옴표든 똑같이 동작합니다.
greeting = "Hello, world"
username = '민준'따옴표 선택이 중요한 경우는 텍스트 안에 따옴표가 포함될 때뿐입니다. 이스케이프할 필요가 없도록 반대 스타일을 사용하세요:
note = "It's a great day" # 안에 아포스트로피, 큰따옴표 사용
message = 'She said "hello"' # 안에 큰따옴표, 작은따옴표 사용
escaped = "She said \"hello\"" # 또는 백슬래시로 이스케이프불변성
문자열은 불변입니다: 한 번 만들면 바꿀 수 없습니다. 문자열은 만들어지는 순간 영구적으로 고정된다고 생각하세요. 문자열을 수정하는 것처럼 보이는 모든 연산은 실제로는 완전히 새로운 문자열을 만들어내는 것입니다. 원본은 그대로 유지됩니다.
name = "민준"
name = name.upper() # "민준"은 변경되지 않고, 새 문자열이 만들어짐직접적인 결과: 특정 위치의 문자를 바꿀 수 없습니다. 시도하면 파이썬이 오류를 발생시킵니다.
name = "alice"
name[0] = "A" # TypeError: 'str' object does not support item assignment수정된 문자열을 얻으려면 슬라이싱이나 메서드를 사용해 새 문자열을 만드세요. 둘 다 아래에서 다룹니다.
인덱싱과 슬라이싱
문자열의 모든 문자는 0부터 시작하는 번호 매겨진 위치를 가집니다. 대괄호 안에 위치 번호를 넣어 개별 문자를 읽을 수 있습니다. 음수는 끝에서부터 거꾸로 셉니다.
word = "Python"
# 012345
print(word[0]) # "P"
print(word[2]) # "t"
print(word[5]) # "n"
print(word[-1]) # "n" (마지막 문자)
print(word[-2]) # "o" (끝에서 두 번째)-1은 항상 마지막 문자, -2는 끝에서 두 번째, 이런 식입니다. 문자열의 정확한 길이를 모를 때 끝부분을 원할 때 유용합니다.
슬라이싱은 덩어리를 추출합니다. [start:stop]은 start를 포함하고 stop을 제외합니다:
word = "Python"
print(word[0:2]) # "Py" (위치 0과 1)
print(word[2:]) # "thon" (위치 2부터 끝까지)
print(word[:3]) # "Pyt" (시작부터 위치 2까지)
print(word[:]) # "Python" (전체 문자열의 복사본)
print(word[::2]) # "Pto" (두 문자마다 하나씩)
print(word[::-1]) # "nohtyP" (뒤집기)가장 자주 사용하는 세 가지 패턴: 처음 n개 문자를 위한 word[:n], 위치 n부터 끝까지를 위한 word[n:], 마지막 n개 문자를 위한 word[-n:]. word[::-1]은 문자열을 뒤집습니다. 처음에는 이상해 보이지만, 이것은 관용적인 파이썬이며 자주 보게 될 것입니다.
필수 문자열 메서드
문자열에는 내장 메서드들이 함께 옵니다: 모든 문자열 값에서 직접 호출할 수 있는 연산들이죠. 문자열(또는 그 문자열을 담은 변수)을 쓰고, 점을 찍고, 메서드 이름을 씁니다. 각 메서드는 새 문자열을 반환합니다. 원본은 절대 변경되지 않습니다.
대소문자
text = "Hello, World"
text.lower() # "hello, world"
text.upper() # "HELLO, WORLD"
text.title() # "Hello, World" (각 단어 대문자화)
text.capitalize() # "Hello, world" (첫 단어만)lower()와 upper()가 가장 자주 사용할 두 가지입니다. lower()는 특히 텍스트를 비교할 때 유용합니다: 양쪽에 .lower()를 호출하면 "Alice"와 "alice"는 같은 것이 됩니다.
공백
text = " hello "
text.strip() # "hello" (양쪽)
text.lstrip() # "hello " (왼쪽만)
text.rstrip() # " hello" (오른쪽만)strip()은 문자열의 양 끝에서 공백을 제거합니다. 사용자 입력이나 파일에서 가져온 텍스트를 다룰 때 거의 항상 사용하게 됩니다. 떠도는 공백은 조용한 실패를 일으키기 때문이죠: "alice" != "alice ".
찾기
text = "Hello, world"
text.find("world") # 7
text.find("Python") # -1 (찾지 못함)
text.count("l") # 3
text.startswith("Hello") # True
text.endswith("world") # Truefind()는 문자열 안에서 특정 텍스트 조각이 시작되는 위치를 반환합니다. 거기에 없으면 -1을 반환합니다. 문자열이 특정 무언가로 시작하거나 끝나는지만 신경 쓸 때는 startswith()와 endswith()를 사용하세요.
치환
text = "Hello, world"
text.replace("world", "Python") # "Hello, Python"
text.replace("l", "L") # "HeLLo, worLd" (모든 등장)
text.replace("l", "L", 1) # "HeLlo, world" (첫 번째만)replace()는 한 텍스트 조각의 모든 등장을 다른 것으로 교체하고 새 문자열을 돌려줍니다. 원본은 변경되지 않습니다. 첫 번째 등장만 교체하고 싶다면 세 번째 인자를 전달하세요.
분할과 결합
split()은 구분자에서 문자열을 조각으로 자르고 리스트로 반환합니다. 무엇으로 자를지 알려주면 됩니다:
csv_row = "민준,28,서울"
parts = csv_row.split(",") # ["민준", "28", "서울"]
" hello world ".split() # ["hello", "world"]리스트가 뭔가요?
리스트는 순서가 있는 값들의 모음입니다. 위의 ["민준", "28", "서울"]이 하나의 리스트입니다. 리스트는 자체적인 챕터를 갖고 있습니다; 지금은 split()이 생성하고 join()이 소비하는 아이템들의 시퀀스로 취급하세요.
join()은 그 반대를 합니다: 문자열 리스트를 하나로 결합합니다. .join() 앞의 문자열은 각 항목 사이에 놓입니다:
words = ["Hello", "world"]
" ".join(words) # "Hello world"
", ".join(words) # "Hello, world"
"".join(words) # "Helloworld"기억해야 할 패턴: separator.join(list_of_strings). 구분자는 왼쪽에, 리스트는 오른쪽에. " ".join(words)는 각 단어 사이에 공백을 넣습니다. "".join(words)는 사이에 아무것도 없이 붙입니다.
f-문자열
f-문자열은 값을 텍스트 안에 직접 임베드합니다. 여는 따옴표 앞에 f를 넣고, 변수나 표현식을 중괄호로 감싸세요. 코드가 실행될 때 파이썬이 채워 넣습니다. 값 뒤에 콜론을 추가해 표시 방법을 제어할 수도 있습니다.
name = "민준"
score = 94.5
print(f"Hello, {name}!") # "Hello, 민준!"
print(f"Score: {score:.1f}%") # "Score: 94.5%"
print(f"2 + 2 = {2 + 2}") # "2 + 2 = 4"
print(f"Name: {name.upper()}") # "Name: 민준": 뒤의 포맷 명세는 값이 어떻게 표시될지 제어합니다:
| 명세 | 의미 | 예시 |
|---|---|---|
.2f | 소수점 2자리 | f"{3.14159:.2f}" → "3.14" |
.0% | 퍼센트, 소수점 없음 | f"{0.94:.0%}" → "94%" |
, | 천 단위 구분자 | f"{1000000:,}" → "1,000,000" |
>10 | 10자 내 우측 정렬 | f"{'hi':>10}" → " hi" |
.2f를 가장 많이 사용하게 됩니다: 소수를 표시할 때마다 긴 숫자 행렬 대신 깔끔한 숫자를 원할 때입니다. 표의 나머지는 필요할 때 거기에 있습니다. {} 안에 어떤 변수, 산술, 메서드 호출이든 넣을 수 있습니다.
여러 줄 문자열
한 줄 이상에 걸친 문자열을 작성하려면 삼중 따옴표를 사용하세요: 시작에 " 세 개, 끝에 세 개. 파이썬은 작성한 그대로 모든 줄바꿈과 간격을 보존합니다.
message = """
민준님께,
주문해 주셔서 감사합니다.
감사합니다,
The Team
"""이스케이프 시퀀스
어떤 문자들은 문자열 안에 직접 입력하기 어렵습니다. 파이썬은 이스케이프 시퀀스를 사용합니다: 무언가를 나타내는 백슬래시 뒤의 글자입니다. 자주 사용할 두 가지는 새 줄을 위한 \n과 탭을 위한 \t입니다.
| 시퀀스 | 문자 |
|---|---|
\n | 줄바꿈 |
\t | 탭 |
\\ | 리터럴 백슬래시 |
\" | 큰따옴표 |
\' | 작은따옴표 |
print("Line one\nLine two") # 두 줄의 출력
print("Name:\tAlice") # Name: Alice
path = r"C:\Users\Alice\Documents" # 원시 문자열, 이스케이프 처리 없음문자열 내용 검사
파이썬에는 문자열이 무엇을 포함하는지에 대한 예/아니요 질문에 답하는 메서드가 있습니다. True 또는 False를 반환합니다. 초기에 가장 유용한 것: isdigit()은 변환 전에 문자열이 모두 숫자인지 확인하게 해주어 예상치 못한 입력에서의 크래시를 피할 수 있게 합니다.
"42".isdigit() # True
"hello".isalpha() # True
"hello42".isalnum() # True
" ".isspace() # True
"Hello".islower() # False
"HELLO".isupper() # True실전에서
공백을 제거하고, 대소문자를 정규화한 다음, 필요한 것을 꺼내세요. 이 순서는 거의 모든 사용자 제공 텍스트를 처리합니다:
raw_input = " [email protected] "
email = raw_input.strip().lower() # "[email protected]"
at_pos = email.find("@")
username = email[:at_pos]
domain = email[at_pos + 1:]
print(f"User: {username}") # "minjun"
print(f"Domain: {domain}") # "example.com"메서드 참조
| 메서드 | 하는 일 |
|---|---|
.lower() / .upper() | 모두 소문자 / 모두 대문자로 변환 |
.title() / .capitalize() | 각 단어 대문자화 / 첫 단어만 |
.strip() / .lstrip() / .rstrip() | 둘러싼 공백 제거 |
.find(sub) | 첫 매치의 인덱스, 또는 -1 |
.count(sub) | sub가 몇 번 나타나는지 |
.startswith(s) / .endswith(s) | 접두사 / 접미사 검사 |
.replace(old, new) | 등장 교체 |
.split(sep) | 리스트로 분할 |
sep.join(iterable) | 항목을 문자열로 결합 |
.isdigit() / .isalpha() / .isalnum() | 문자 타입 검사 |

