Development Tip

Python 강좌 03 - 문자열

MoonLight314 2024. 12. 23. 11:00
728x90

이번 강좌는 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

728x90

'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