이번 강좌는 Python의 문자열에 관해서 알아보도록 하겠습니다.
Python에서 문자열은 텍스트 데이터를 표현하기 위한 기본 데이터 타입입니다.
문자열은 불변(immutable)이며, 다양한 내장 메서드와 연산을 통해 조작할 수 있습니다.
1. 기본 사항
1.1. 문자열의 기본 특징
1.1.1. 불변성 (Immutable)
기본적으로 문자열은 생성된 후 수정할 수 없습니다. 새로운 문자열을 생성해야 합니다.
s = "hello"
s[0] = "H" # 오류 발생
s = "Hello" # 새로운 문자열로 대체
1.1.2. 인덱스와 슬라이싱 지원
문자열은 기본적으로 시퀀스 자료형으로, Index를 통해 문자에 접근하거나 부분 문자열을 가져올 수 있습니다.
슬라이싱(Slicing) 기본 문법
string[start:end:step]
start : Slicing이 시작되는 Index(포함). 기본값은 0.
end : Slicing이 끝나는 Index(포함하지 않음). 기본값은 문자열의 길이.
step : Slicing의 간격. 기본값은 1.
1. 기본 슬라이싱
text = "Hello, World!"
print(text[0:5]) # "Hello" , 문자열의 0번 인덱스부터 5번 인덱스 직전까지(end는 포함되지 않음).
2. start 생략
print(text[:5]) # "Hello" , start를 생략하면 문자열의 처음부터 시작합니다.
3. end 생략
print(text[7:]) # "World!" end를 생략하면 문자열의 끝까지 포함합니다.
print(text[:]) # "Hello, World!"
4. Step 지정
text = "abcdef"
print(text[0:6:2]) # "ace" , text[0:6:2]: 0번 인덱스부터 6번 인덱스 직전까지, 2칸씩 건너뜁니다.
5. Step 음수 (역방향 Slicing)
text = "abcdef"
print(text[::-1]) # "fedcba" , [::-1]: 문자열 전체를 역순으로 반환합니다.
6. Step 음수와 start, end
text = "abcdef"
print(text[5:1:-1]) # "fedc"
text[5:1:-1] #5번 인덱스부터 1번 인덱스 직전까지 역순으로 슬라이싱.
# 음수 인덱스 사용
# Python의 문자열 인덱스는 음수 값을 지원하여 문자열의 끝에서부터 인덱싱할 수 있습니다.
7. 음수 Index Slicing
text = "Hello, World!"
print(text[-6:-1]) # "World"
# -6: 끝에서 6번째 문자부터 시작.
# -1: 끝에서 1번째 문자 직전까지.
8. 음수 Step과 음수 Index
text = "Hello, World!"
print(text[-1:-7:-1]) # "!dlroW" , -1:-7:-1: 끝에서 1번째부터 끝에서 7번째 문자까지 역순으로 슬라이싱.
9. 부분 문자열 추출
text = "python slicing example"
print(text[7:14]) # "slicing"
10. 문자열 뒤집기
text = "abcdef"
print(text[::-1]) # "fedcba"
11. 짝수/홀수 Index 문자 추출
text = "abcdef"
print(text[::2]) # "ace" (짝수 인덱스)
print(text[1::2]) # "bdf" (홀수 인덱스)
12. 문자열에서 특정 범위 제거
text = "Hello, World!"
print(text[:7] + text[8:]) # "Hello, orld!"
13. 문자열 Slicing의 특징
Slicing은 새로운 문자열을 반환합니다.
원본 문자열은 변경되지 않습니다(문자열은 불변 객체).
경계를 벗어난 Slicing : Slicing 범위를 벗어나도 에러가 발생하지 않으며, 가능한 부분까지만 반환합니다.
text = "abc"
print(text[1:100]) # "bc"
1.2. 문자열 조작 방법
1.2.1. 연결과 반복
문자열은 + 연산자로 연결(concatenation)하고, * 연산자로 반복 가능합니다.
s1 = "Hello"
s2 = "World"
print(s1 + " " + s2) # Hello World
print(s1 * 3) # HelloHelloHello
1.2.2. 문자열 메서드
1. 대소문자 변환
s = "Python"
print(s.upper()) # 'PYTHON'
print(s.lower()) # 'python'
print(s.capitalize()) # 'Python' (첫 글자만 대문자)
print(s.title()) # 'Python Programming' (단어 첫 글자 대문자)
2. 공백 제거
s = " hello world "
print(s.strip()) # 'hello world' (양쪽 공백 제거)
print(s.lstrip()) # 'hello world ' (왼쪽 공백 제거)
print(s.rstrip()) # ' hello world' (오른쪽 공백 제거)
3. 문자열 찾기
s = "hello world"
print(s.find("o")) # 4 (처음 발견된 위치 반환)
print(s.rfind("o")) # 7 (오른쪽에서 처음 발견된 위치 반환)
print(s.index("o")) # 4 (find와 동일하지만, 없으면 오류 발생)
print(s.count("l")) # 3 ('l'의 개수 세기)
4. 문자열 대체
s = "hello world"
print(s.replace("world", "Python")) # 'hello Python'
5. 문자열 분리와 결합
분리: 문자열을 특정 구분자로 나눔.
결합: List를 특정 구분자로 이어붙임.
s = "apple,banana,cherry"
fruits = s.split(",") # ['apple', 'banana', 'cherry']
print(fruits)
joined = " - ".join(fruits)
print(joined) # 'apple - banana - cherry'
6. 문자열 검사
문자열의 성격을 확인하는 메서드들은 아래와 같은 것들이 있습니다.
메서드
|
설명
|
isalpha()
|
알파벳 문자로만 이루어졌는지 확인.
|
isdigit()
|
숫자로만 이루어졌는지 확인.
|
isalnum()
|
알파벳 또는 숫자로만 이루어졌는지 확인.
|
isspace()
|
공백 문자로만 이루어졌는지 확인.
|
startswith()
|
특정 문자열로 시작하는지 확인.
|
endswith()
|
특정 문자열로 끝나는지 확인.
|
s = "Python3"
print(s.isalpha()) # False (숫자가 포함됨)
print(s.isalnum()) # True
print(s.startswith("Py")) # True
print(s.endswith("3")) # True
7. 문자열 정렬과 채우기
s = "hello"
print(s.center(10, "-")) # '--hello---' (가운데 정렬)
print(s.ljust(10, "-")) # 'hello-----' (왼쪽 정렬)
print(s.rjust(10, "-")) # '-----hello' (오른쪽 정렬)
1.2.3. 문자열 서식화
0. 기본 문법
"문자열 {플레이스홀더}".format(값1, 값2, ...)
{ } : 플레이스홀더로 값이 삽입될 위치를 지정.
.format() : 메서드에 전달된 값이 { }에 삽입됩니다.
1. 위치 기반 플레이스홀더
print("Hello, {}!".format("World")) # Hello, World!
print("{} is {} years old.".format("Alice", 25)) # Alice is 25 years old.
첫 번째 {}에 "World", 두 번째 {}에 "Alice"와 25가 순서대로 삽입됩니다.
2. 인덱스를 사용한 위치 지정
print("{1} is {0} years old.".format(25, "Alice")) # Alice is 25 years old.
{1}은 .format()의 두 번째 값, {0}은 첫 번째 값을 참조합니다.
3. 키워드 인수 사용
print("{name} is {age} years old.".format(name="Alice", age=25))
출력:
Alice is 25 years old.
4. 숫자 포맷팅
{:.2f}: 소수점 2자리까지 표시
{:,}: 천 단위 구분 기호 추가
{:+}: 숫자 앞에 부호 표시
print("Pi is approximately {:.2f}".format(3.14159)) # Pi is approximately 3.14
print("The population is {:,}".format(1234567890)) # The population is 1,234,567,890
print("The temperature is {:+}°C".format(-5)) # The temperature is -5°C
5. 정렬
왼쪽 정렬: {:<10}
오른쪽 정렬: {:>10}
가운데 정렬: {:^10}
print("|{:<10}|".format("left")) # |left |
print("|{:>10}|".format("right")) # | right|
print("|{:^10}|".format("center")) # | center |
6. 문자열 포맷팅
길이 지정 및 잘라내기
print("{:.5}".format("Hello, World!")) # Hello
패딩 문자 지정
print("{:*^10}".format("Hi")) # ***Hi*****
f-string (Python 3.6 이상)
Python 3.6 이상에서는 f-string을 사용하여 문자열 포맷팅을 더 간단히 표현할 수 있습니다.
이는 format보다 읽기 쉽고, 가독성이 좋습니다.
name = "Alice"
age = 25
print(f"{name} is {age} years old.")
출력:
Alice is 25 years old.
f-string에서 포맷팅
pi = 3.14159
print(f"Pi is approximately {pi:.2f}") # Pi is approximately 3.14
print(f"The population is {1234567890:,}") # The population is 1,234,567,890
7. 사전(dict) 사용
format 메서드는 Dictionary를 통해 값을 삽입할 수도 있습니다.
data = {"name": "Alice", "age": 25}
print("{name} is {age} years old.".format(**data))
출력:
Alice is 25 years old.
8. List & Tuple 사용
values = ("Alice", 25)
print("{} is {} years old.".format(*values))
출력:
Alice is 25 years old.
9. 포맷 문자열을 동적으로 생성
template = "{0} loves {1}."
print(template.format("Alice", "Python")) # Alice loves Python.
10. % 연산자
print("My name is %s and I am %d years old." % (name, age))
1.3. 문자열 관련 유용한 기능
1.3.1. 역순 문자열
s = "Python"
print(s[::-1]) # 'nohtyP' (역순 출력)
1.3.2. 여러 줄 문자열
Python에서는 삼중 따옴표(""" 또는 ''')를 사용해 여러 줄 문자열을 작성할 수 있습니다.
s = """This is a
multiline
string."""
print(s)
1.3.3. 유니코드와 인코딩
문자 -> 유니코드 코드 포인트
print(ord('A')) # 65
유니코드 코드 포인트 -> 문자
print(chr(65)) # 'A'
2. 예제
앞서 살펴본 문자열 관련 내용들을 바탕으로 몇가지 예제를 풀어보면서 익혀보도록 하겠습니다.
Ex. 1. letters가 바인딩하는 문자열에서 첫번째와 세번째 문자를 출력하세요.
letters = 'python'
print(letters[0] , letters[2])
출력:
p t
Index를 이용하면 쉽게 풀 수 있습니다.
Ex. 2. 자동차 번호가 다음과 같을 때 뒤에 4자리만 출력하세요.
license_plate = "24가 2210"
license_plate = "24가 2210"
print(license_plate[-4:])
출력:
2210
끝에서부터 4자리만 Slicing으로 잘라내도 되고, split()으로 공백을 기준으로 분리해서 2번째 것을 선택해도 되는 문제입니다.
Ex. 3. 아래의 문자열에서 '홀' 만 출력하세요.
string = "홀짝홀짝홀짝"
string = "홀짝홀짝홀짝"
print(string[::2])
출력:
홀홀홀
'홀'은 홀수 Index에만 있기 때문에 Step을 2씩 증가시켜서 출력하면 됩니다.
Ex. 4. 문자열을 거꾸로 뒤집어 출력하세요.
string = "PYTHON"
string = "PYTHON"
print(string[::-1])
출력:
NOHTYP
Step을 음수로 하면 반대로 Indexing이 되는 것을 이용해서 끝에서부터 출력하면 문자열을 뒤집어서 출력하는 효과를 봅니다.
Ex. 5. 아래의 전화번호에서 하이푼 ('-')을 제거하고 출력하세요.
phone_number = "010-1111-2222"
phone_number = "010-1111-2222"
print(phone_number.replace("-"," "))
출력:
010 1111 2222
파이썬 문자열에서 replace 메서드를 사용하면 문자열을 일부를 치환할 수 있습니다. 문자열은 수정할 수 없는 자료형이므로 기존 문자열은 그대로 두고 치환된 새로운 문자열이 리턴됩니다.
Ex. 6. 아래의 전화번호 아래와 같이 모두 붙여 출력하세요.
phone_number = "010-1111-2222"
print(phone_number.replace("-",""))
출력:
01011112222
replace를 이용해서 -를 공백으로 처리해 버리면 -가 다 없어진다.
Ex. 7. url 에 저장된 웹 페이지 주소에서 도메인을 출력하세요.
url = "http://sharebook.kr"
url = "http://sharebook.kr"
print(url.split(".")[-1])
출력:
kr
문자열로 표현된 url에서 `.`을 기준으로 분리합니다. 문자열을 특정 문자로 분리할 때는 .split()을 사용합니다.
Ex. 8. 아래 코드의 실행 결과를 예상해보세요.
lang = 'python'
lang[0] = 'P'
print(lang)
출력:
{
"name": "TypeError",
"message": "'str' object does not support item assignment",
"stack": "---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[1], line 2
1 lang = 'python'
----> 2 lang[0] = 'P'
3 print(lang)
TypeError: 'str' object does not support item assignment"
}
문자열은 수정할 수 없습니다. 실행 결과를 확인해보면 문자열이 할당(assignment) 메서드를 지원하지 않음을 알 수 있습니다.
Ex. 9. 아래 문자열에서 소문자 'a'를 대문자 'A'로 변경하세요.
string = 'abcdfe2a354a32a'
string = 'abcdfe2a354a32a'
print(string.replace('a','A'))
출력:
Abcdfe2A354A32A
replace를 이용해서 'a'를 'A'로 바꾸면 된다.
Ex. 10. 아래 코드의 실행 결과를 예상해보세요.
string = 'abcd'
string.replace('b', 'B')
print(string)
출력:
abcd
`abcd`가 그대로 출력됩니다. 왜냐하면 문자열은 변경할 수 없는 자료형이기 때문입니다. replace 메서드를 사용하면 원본은 그대로 둔채로 변경된 새로운 문자열 객체를 리턴해줍니다.
Ex. 11. 아래 코드의 실행 결과를 예상해보세요.
a = "3"
b = "4"
print(a + b)
출력:
34
두 문자열에 대해 덧셈 기호는 문자열의 연결을 의미합니다. 따라서 "34"라는 새로운 문자열이 생성되고 그 값이 print 함수에 의해 화면에 출력됩니다.
Ex. 12. 아래 코드의 실행 결과를 예상해보세요.
print("Hi" * 3)
출력:
HiHiHi
문자열에 대한 곱셈은 문자열의 반복을 의미합니다. 따라서 다음과 같이 문자열이 출력됩니다.
Ex. 13. 화면에 '-'를 80개 출력하세요.
print('-' * 80)
출력:
--------------------------------------------------------------------------------
Ex. 14. 변수에 다음과 같은 문자열이 바인딩되어 있습니다.
t1 = 'python'
t2 = 'java'
변수에 문자열 더하기와 문자열 곱하기를 사용해서 아래와 같이 출력해보세요.
실행 예:
python java python java python java python java
t1 = 'python'
t2 = 'java'
print((t1 +' '+ t2 + ' ')*4)
출력:
python java python java python java python java
Ex. 15. 변수에 다음과 같이 문자열과 정수가 바인딩되어 있을 때 % formatting을 사용해서 다음과 같이 출력해보세요.
name1 = "김민수"
age1 = 10
name2 = "이철희"
age2 = 13
이름: 김민수 나이: 10
이름: 이철희 나이: 13
name1 = "김민수"
age1 = 10
name2 = "이철희"
age2 = 13
print("이름: %s 나이: %d" % (name1, age1))
print("이름: %s 나이: %d" % (name2, age2))
출력:
이름: 김민수 나이: 10
이름: 이철희 나이: 13
Ex. 16. 문자열의 format( ) 메서드를 사용해서 035번 문제를 다시 풀어보세요.
name1 = "김민수"
age1 = 10
name2 = "이철희"
age2 = 13
print("이름: {} 나이: {}".format(name1, age1))
print("이름: {} 나이: {}".format(name2, age2))
출력:
이름: 김민수 나이: 10
이름: 이철희 나이: 13
Ex. 17. 파이썬 3.6부터 지원하는 f-string을 사용해서 035번 문제를 다시 풀어보세요
name1 = "김민수"
age1 = 10
name2 = "이철희"
age2 = 13
print(f"이름: {name1} 나이: {age1}")
print(f"이름: {name2} 나이: {age2}")
출력:
이름: 김민수 나이: 10
이름: 이철희 나이: 13
Ex. 18. 삼성전자의 상장주식수가 다음과 같습니다. 컴마를 제거한 후 이를 정수 타입으로 변환해보세요.
상장주식수 = "5,969,782,550"
print(int(상장주식수.replace(',','')))
출력:
5969782550
Ex. 19. 다음과 같은 문자열에서 '2020/03'만 출력하세요.
분기 = "2020/03(E) (IFRS연결)"
print(분기.split('(')[0])
출력:
2020/03
Ex. 20. 문자열의 좌우의 공백이 있을 때 이를 제거해보세요.
data = " 삼성전자 "
print(data.strip())
출력:
삼성전자
.strip()은 공백을 없애는데 사용할 수 있습니다.
Ex. 21. 다음과 같은 문자열이 있을 때 이를 대문자 BTC_KRW로 변경하세요.
ticker = "btc_krw"
print(ticker.upper())
출력:
BTC_KRW
.upper()는 문자를 모두 대문자로 변경합니다.
Ex. 22. 다음과 같은 문자열이 있을 때 이를 소문자 btc_krw로 변경하세요.
ticker = "BTC_KRW"
print(ticker.lower())
출력:
btc_krw
.lower()는 .upper()와는 반대로 모든 문자를 소문자로 변경합니다.
Ex. 23. 문자열 'hello'가 있을 때 이를 'Hello'로 변경해보세요.
s = 'hello'
print(s.capitalize())
출력:
Hello
capitalize()는 첫번째 문자를 대문자로 변경해 줍니다.
Ex. 24. 파일 이름이 문자열로 저장되어 있을 때 endswith 메서드를 사용해서 파일 이름이 'xlsx'로 끝나는지 확인해보세요.
file_name = "보고서.xlsx"
if file_name.endswith('xlsx'):
print("OK")
else:
print("NG")
출력:
OK
endswith() 메서드는 문자열이 특정 접미사로 끝나는지를 확인하는 데 사용됩니다. 이 메서드는 True 또는 False 값을 반환합니다.
Ex. 25. 파일 이름이 문자열로 저장되어 있을 때 endswith 메서드를 사용해서 파일 이름이 'xlsx' 또는 'xls'로 끝나는지 확인해보세요.
file_name = "보고서.xlsx"
if file_name.endswith(('xlsx','xls')):
print("OK")
else:
print("NG")
출력:
OK
Ex. 26. 파일 이름이 문자열로 저장되어 있을 때 startswith 메서드를 사용해서 파일 이름이 '2020'로 시작하는지 확인해보세요.
file_name = "2020_보고서.xlsx"
if file_name.startswith(('2020')):
print("OK")
else:
print("NG")
출력:
OK
startswith() 메서드는 문자열이 특정 접두사로 시작하는지를 확인하는 데 사용됩니다. 이 메서드는 True 또는 False 값을 반환합니다.
Ex. 27. 다음과 같은 문자열이 있을 때 공백을 기준으로 문자열을 나눠보세요.
a = "hello world"
print(a.split(' '))
출력:
['hello', 'world']
Ex. 28. 다음과 같이 문자열이 있을 때 btc와 krw로 나눠보세요.
ticker = "btc_krw"
print(ticker.split('_'))
출력:
['btc', 'krw']
Ex. 29. 다음과 같이 날짜를 표현하는 문자열이 있을 때 연도, 월, 일로 나눠보세요.
date = "2020-05-01"
print(date.split('-'))
출력:
['2020', '05', '01']
Ex. 30. 문자열의 오른쪽에 공백이 있을 때 이를 제거해보세요.
data = "039490 "
print(data.rstrip())
출력:
039490
도움이 되셨으면 좋겠네요.
다른 강좌도 참고하시면 좋을 것 같습니다. 각 강좌의 Link는 아래를 참고하시기 바랍니다.
Python 강좌 01 - print()
Python 강좌 02 - 변수
Python 강좌 03 - 문자열
Python 강좌 04 - List
Python 강좌 05 - Tuple
Python 강좌 06 - Dictionary
Python 강좌 07 - 분기문
Python 강좌 08 - 반복문
Python 강좌 09 - 함수
Python 강좌 10 - Module
Python 강좌 11 - Class
Python 강좌 12 - File & Exception
'Development Tip' 카테고리의 다른 글
Python 강좌 05 - Tuple (0) | 2024.12.23 |
---|---|
Python 강좌 04 - List (0) | 2024.12.23 |
Python 강좌 02 - 변수 (0) | 2024.12.23 |
Python 강좌 01 - print() (0) | 2024.12.22 |
C# - Application에 DLL을 포함시키는 방법 (0) | 2024.12.22 |