문자열
거의 모든 프로그램에는 텍스트가 나타납니다. 이름, 메시지, 점수, 레이블 등이 있습니다. Python에서는 따옴표로 감싼 모든 텍스트를 문자열이라고 부릅니다. 작은따옴표든 큰따옴표든 같은 방식으로 작동합니다.
greeting = "Hello, world"
username = 'alice'따옴표 선택이 중요한 경우는 텍스트에 따옴표가 포함되어 있을 때입니다. 반대 스타일을 사용하면 이스케이프 처리할 필요가 없습니다:
note = "It's a great day" # apostrophe inside, use double quotes
message = 'She said "hello"' # double quotes inside, use single quotes
escaped = "She said \"hello\"" # or escape with a backslash불변성
문자열은 불변입니다: 한 번 생성하면 변경할 수 없습니다. 문자열을 만드는 순간 영구적으로 고정되어 있다고 생각하세요. 문자열을 수정하는 것처럼 보이는 모든 연산은 실제로 완전히 새로운 것을 생성합니다. 원본은 정확히 그대로 유지됩니다.
name = "alice"
name = name.upper() # "ALICE" is a new string; "alice" is unchanged직접적인 결과: 특정 위치의 문자를 변경할 수 없습니다. 시도하면 Python이 오류를 발생시킵니다.
name = "alice"
name[0] = "A" # TypeError: 'str' object does not support item assignment수정된 문자열을 얻으려면 슬라이싱이나 메서드를 사용하여 새로운 문자열을 만드세요. 둘 다 아래에서 다룹니다.
name[0] = "A"는 작동하지 않고 TypeError를 발생시킵니다. 인덱싱과 슬라이싱
문자열의 모든 문자에는 0부터 시작하는 번호 위치가 있습니다. 대괄호 안에 그 위치 번호를 넣어 개별 문자를 읽을 수 있습니다. 음수는 끝에서 거꾸로 셉니다.
word = "Python"
# 012345
print(word[0]) # "P"
print(word[2]) # "t"
print(word[5]) # "n"
print(word[-1]) # "n" (last character)
print(word[-2]) # "o" (second to last)-1은 항상 마지막 문자, -2는 마지막에서 두 번째이고, 계속 그렇습니다. 정확한 길이를 알지 못할 때 문자열의 끝에 접근하려고 할 때 유용합니다.
슬라이싱은 청크를 추출합니다. [start:stop]은 start를 포함하고 stop을 제외합니다:
word = "Python"
print(word[0:2]) # "Py" (positions 0 and 1)
print(word[2:]) # "thon" (position 2 to end)
print(word[:3]) # "Pyt" (start to position 2)
print(word[:]) # "Python" (a copy of the whole string)
print(word[::2]) # "Pto" (every second character)
print(word[::-1]) # "nohtyP" (reversed)가장 많이 사용할 세 가지 패턴: 처음 n개 문자를 위한 word[:n], 위치 n 이후의 모든 것을 위한 word[n:], 마지막 n개 문자를 위한 word[-n:]. word[::-1]은 문자열을 역순으로 합니다. 처음에는 이상해 보이지만 관례적인 Python이고, 자주 볼 수 있습니다.
word[0]은 첫 문자이고 word[-1]은 마지막 문자입니다. 슬라이스는 범위를 가져갑니다: word[start:stop]은 start를 유지하고 stop 바로 앞에서 멈춥니다. word[::-1]은 문자열을 역순으로 하는데, 처음에는 이상해 보이다가 계속 사용하게 됩니다. 필수 문자열 메서드
문자열에는 내장된 메서드 집합이 있습니다: 모든 문자열 값에서 직접 호출하는 연산입니다. 문자열(또는 이를 보유한 변수)을 쓰고, 점을 쓴 다음, 메서드 이름을 씁니다. 각 메서드는 새로운 문자열을 반환합니다. 원본은 절대 변경되지 않습니다.
대소문자
text = "Hello, World"
text.lower() # "hello, world"
text.upper() # "HELLO, WORLD"
text.title() # "Hello, World" (each word capitalised)
text.capitalize() # "Hello, world" (first word only)lower()와 upper()는 가장 많이 사용할 두 메서드입니다. lower()는 특히 텍스트 비교에 유용합니다: "Alice"와 "alice"는 양쪽에서 .lower()를 호출하면 같은 것이 됩니다.
공백
text = " hello "
text.strip() # "hello" (both sides)
text.lstrip() # "hello " (left only)
text.rstrip() # " hello" (right only)strip()은 문자열의 양쪽 끝에서 공백을 제거합니다. 사용자 입력이나 파일의 텍스트를 처리할 때마다 거의 사용할 것입니다. 왜냐하면 불필요한 공백이 조용한 실패를 일으키기 때문입니다: "alice" != "alice ".
찾기
text = "Hello, world"
text.find("world") # 7
text.find("Python") # -1 (not found)
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" (all occurrences)
text.replace("l", "L", 1) # "HeLlo, world" (first only)replace()는 텍스트의 한 부분을 다른 것으로 교체하고 새로운 문자열을 돌려줍니다. 원본은 변경되지 않습니다. 첫 번째 발생만 교체하려면 세 번째 인수를 전달하세요.
분할과 결합
split()은 구분자에서 문자열을 조각으로 자르고 이를 리스트로 반환합니다. 무엇을 자를지 말합니다:
csv_row = "Alice,28,서울"
parts = csv_row.split(",") # ["Alice", "28", "서울"]
" hello world ".split() # ["hello", "world"]split()은 리스트, 값의 정렬된 시퀀스를 반환합니다. 리스트는 자신의 리스트 장이 있으며, 지금은 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)는 사이에 아무것도 없이 이를 접합니다.
.lower()와 .upper(), 불필요한 공백을 다듬기 위한 .strip(), 텍스트를 찾기 위한 .find()(없을 때 -1 반환), 텍스트를 교체하기 위한 .replace(), 문자열을 분리하고 다시 모으기 위한 .split()과 sep.join(). f-문자열
f-문자열은 값을 텍스트 직접 내에 포함합니다. 여는 따옴표 전에 f를 넣고, 중괄호에 모든 변수나 표현식을 감쌉니다. Python은 코드가 실행될 때 이를 채워 넣습니다. 값 뒤에 콜론을 추가하여 표시 방식을 제어할 수도 있습니다.
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를 사용할 것입니다: 십진수를 표시하고 긴 숫자 실행 대신 정리된 숫자를 원할 때마다. 표에 있는 다른 모든 것은 필요할 때 있습니다. {}에 모든 변수, 산술, 메서드 호출을 넣을 수 있습니다.
f를 넣고, 중괄호에 모든 변수, 합계, 메서드 호출을 감싸면 Python이 줄이 실행될 때 결과를 내려놓습니다. 중괄호 안의 콜론은 모양을 제어합니다: :.2f 2 소수 자리는 당신이 기댈 것입니다. +로 텍스트를 접합니다것보다 훨씬 깔끔합니다. 여러 줄 문자열
한 줄 이상에 걸쳐 있는 문자열을 작성하려면 세 개의 따옴표 표를 사용하세요: 시작 시 3개의 "과 끝에 3개. Python은 모든 줄바꿈과 공백을 정확히 작성한 대로 유지합니다.
message = """
Dear 민수,
Thank you for your order.
Best regards,
The Team
"""이스케이프 시퀀스
일부 문자는 문자열 내에서 직접 입력하기 어렵습니다. Python은 이스케이프 시퀀스를 사용합니다: 무언가를 나타내는 문자 뒤에 백슬래시가 옵니다. 끊임없이 사용할 두 가지는 새 줄을 위한 \n과 탭을 위한 \t입니다.
| 시퀀스 | 문자 |
|---|---|
\n | 줄바꿈 |
\t | 탭 |
\\ | 리터럴 백슬래시 |
\" | 큰따옴표 |
\' | 작은따옴표 |
print("Line one\nLine two") # two lines of output
print("Name:\t민수") # Name: 민수
path = r"C:\Users\Alice\Documents" # raw string, no escape processing\n은 새 줄을 시작하고, \t는 탭을 삽입하고, \\은 하나의 진짜 백슬래시입니다. 그 두 개, \n과 \t는 실제로 타이핑할 것들입니다. 따옴표 앞에 r을 팝하면 백슬래시는 평문으로 돌아가고, Windows 경로에 편리합니다. 문자열 내용 확인
Python은 문자열이 무엇을 포함하는지에 대해 예/아니오 질문에 답하는 메서드를 갖습니다. True 또는 False를 반환합니다. 초기에 가장 유용한 것: isdigit()은 변환하기 전에 문자열이 모두 숫자인지 확인하므로, 예상하지 못한 입력에서 충돌을 피할 수 있습니다.
"42".isdigit() # True
"hello".isalpha() # True
"hello42".isalnum() # True
" ".isspace() # True
"Hello".islower() # False
"HELLO".isupper() # Trueis* 메서드는 예/아니오 질문에 답하고 모든 문자가 맞을 때만 True를 반환합니다. 먼저 사용할 것: isdigit()을 int() 전에 호출하여 텍스트가 정말 숫자인지 확인하세요. 이상한 입력이 충돌하지 않도록 합니다. 실제로
공백을 다듬고, 대소문자를 정규화하고, 필요한 것을 뽑아내세요. 이 순서는 거의 모든 사용자 제공 텍스트를 처리합니다:
raw_input = " 민수@example.com "
email = raw_input.strip().lower() # "민수@example.com"
at_pos = email.find("@")
username = email[:at_pos]
domain = email[at_pos + 1:]
print(f"User: {username}") # "민수"
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() | 문자 타입 확인 |

