파이썬 문자열 다루기

PythonBeginner
지금 연습하기

소개

본 실습에서는 파이썬의 기본 데이터 타입인 문자열 (string) 을 다루는 실질적인 경험을 쌓게 됩니다. 문자열 생성, 불변성 (immutability), 그리고 양수 및 음수 인덱싱을 사용한 개별 문자 접근을 포함하여 문자열의 기본 사항을 이해하는 것부터 시작합니다.

이러한 기초를 바탕으로, 슬라이싱 (slicing) 을 사용하여 부분 문자열을 추출하는 방법, 조작 및 특수 서식을 위한 다양한 문자열 연산자 및 이스케이프 문자 (escape characters) 활용법, 그리고 문자열 서식을 위한 여러 가지 방법들을 학습하게 됩니다. 마지막으로, 문자열 내에서 검색, 대체, 내용 수정과 같은 작업을 수행하기 위한 일반적인 문자열 메서드 (string methods) 를 심도 있게 탐구합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 97%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

문자열 기본 및 인덱싱 이해하기

이 단계에서는 파이썬에서 문자열을 생성하는 방법과 인덱싱을 사용하여 개별 문자에 접근하는 방법을 포함하여 문자열의 기본 개념을 학습합니다. 문자열은 문자의 시퀀스이며 가장 일반적인 데이터 타입 중 하나입니다. 작은따옴표 ('...') 또는 큰따옴표 ("...") 를 사용하여 문자열을 생성할 수 있습니다.

파이썬 문자열의 주요 특징은 **불변성 (immutable)**을 가진다는 것입니다. 즉, 생성된 후에는 내용을 변경할 수 없습니다. 문자열을 수정하는 것처럼 보이는 모든 연산은 실제로는 새로운 문자열을 생성합니다.

이를 확인해 봅시다. WebIDE 에서 왼쪽 파일 탐색기에서 ~/project 디렉토리 내의 string_basics.py 파일을 엽니다. 다음 코드를 파일에 추가합니다.

## string_basics.py

## 문자열은 불변입니다. 변수에 새 문자열을 할당하면
## 새로운 메모리 주소를 가진 새 문자열 객체가 생성됩니다.
a = "hello"
print(f"Value: {a}, ID: {id(a)}")

a = "hi"
print(f"Value: {a}, ID: {id(a)}")

스크립트를 실행하려면 WebIDE 에서 터미널을 열고 (Terminal -> New Terminal) 다음 명령을 실행합니다.

python ~/project/string_basics.py

ID 값이 다른 아래와 유사한 출력을 보게 될 것이며, 이는 새로운 문자열 객체가 생성되었음을 확인시켜 줍니다.

Value: hello, ID: <placeholder>
Value: hi, ID: <placeholder>

이제 문자열 인덱싱을 탐색해 보겠습니다. 인덱스 (위치) 를 사용하여 개별 문자에 접근할 수 있습니다. 파이썬에서는 첫 번째 문자의 인덱스가 0부터 시작합니다.

양수 인덱싱을 포함하도록 string_basics.py 파일을 수정합니다.

## string_basics.py
a = "Hello"

## 양수 인덱싱 (처음부터)
print("Positive Indexing:")
print(a[0])
print(a[1])
print(a[2])
print(a[3])
print(a[4])

## 존재하지 않는 인덱스에 접근하면 IndexError 가 발생합니다.
## print(a[5])

파일을 저장하고 다시 실행합니다.

python ~/project/string_basics.py
Positive Indexing:
H
e
l
l
o

파이썬은 또한 문자열 끝에서부터 문자에 접근하는 음수 인덱싱도 지원합니다. 마지막 문자는 인덱스 -1, 그 앞 문자는 -2 등으로 접근합니다.

string_basics.py 파일에 음수 인덱싱 예제를 추가합니다.

## string_basics.py
a = "Hello"

## 양수 인덱싱 (처음부터)
print("Positive Indexing:")
print(a[0])
print(a[1])
print(a[2])
print(a[3])
print(a[4])

## 음수 인덱싱 (끝에서부터)
print("\nNegative Indexing:")
print(a[-5])
print(a[-4])
print(a[-3])
print(a[-2])
print(a[-1])

## 문자열은 불변이므로 문자를 변경할 수 없습니다.
## 다음 줄은 TypeError: 'str' object does not support item assignment 를 발생시킵니다.
## a[0] = "J"

파일을 저장하고 이 단계를 위해 마지막으로 한 번 더 실행합니다.

python ~/project/string_basics.py
Positive Indexing:
H
e
l
l
o

Negative Indexing:
H
e
l
l
o

문자열 슬라이싱하기

이 단계에서는 슬라이싱 (slicing) 을 사용하여 문자열에서 부분 문자열을 추출하는 방법을 학습합니다. 인덱싱이 단일 문자를 가져오는 반면, 슬라이싱은 문자 시퀀스를 가져옵니다.

슬라이싱의 기본 구문은 string[start:end]입니다. 이는 start 인덱스부터 시작하여 end 인덱스 직전까지의 문자열 부분을 추출합니다.

~/project 디렉토리에서 string_slicing.py 파일을 엽니다. 기본 슬라이싱을 시연하기 위해 다음 코드를 추가합니다.

## string_slicing.py
a = "Hello World"

## 인덱스 0 부터 인덱스 5 직전까지 슬라이싱
print(a[0:5])

## 인덱스 6 부터 문자열 끝까지 슬라이싱
print(a[6:])

## 처음부터 인덱스 5 직전까지 슬라이싱
print(a[:5])

## 슬라이싱에 음수 인덱스 사용
print(a[-5:-2])

## 전체 문자열 복사본 가져오기
print(a[:])

파일을 저장하고 터미널에서 실행합니다.

python ~/project/string_slicing.py
Hello
World
Hello
Wor
Hello World

슬라이싱은 세 번째 매개변수인 stepstring[start:end:step] 구문으로 사용할 수도 있습니다. step 값은 슬라이스 내 문자들 사이의 간격을 결정합니다.

step을 포함하는 예제를 추가하도록 string_slicing.py를 수정합니다.

## string_slicing.py
a = "Hello World"

## ... (이전 코드) ...

b = "0123456789"

## 처음부터 끝까지 두 번째 문자마다 가져오기
print(b[::2])

## 인덱스 1 부터 7 까지, 간격 3 으로 문자 가져오기
print(b[1:7:3])

## 음수 step 은 방향을 반대로 합니다. 이는 전체 문자열을 뒤집습니다.
print(b[::-1])

## 인덱스 7 부터 인덱스 2 직전까지 역순으로 가져오기
print(b[7:2:-1])

파일을 저장하고 다시 실행합니다.

python ~/project/string_slicing.py
Hello
World
Hello
Wor
Hello World
02468
14
9876543210
76543

슬라이싱은 유연하여 범위를 벗어난 인덱스를 자동으로 처리하므로 오류를 방지합니다.

이 동작을 확인하기 위해 string_slicing.py에 다음 마지막 줄들을 추가합니다.

## string_slicing.py
a = "Hello World"

## ... (이전 코드) ...

b = "0123456789"

## ... (이전 코드) ...

## 범위를 벗어난 인덱스로 슬라이싱
c = "Python"
## 끝 인덱스가 문자열 길이보다 크지만, 문제없이 작동합니다.
print(c[2:100])

## 시작 인덱스가 문자열 시작보다 작지만, 문제없이 작동합니다.
print(c[-100:4])

스크립트를 저장하고 실행합니다.

python ~/project/string_slicing.py
Hello
World
Hello
Wor
Hello World
02468
14
9876543210
76543
thon
Pyth

문자열 연산자 및 이스케이프 문자 사용하기

이 단계에서는 문자열과 함께 사용되는 일반적인 연산자와 특수 문자를 표현하기 위해 이스케이프 문자 (escape characters) 를 사용하는 방법을 학습합니다.

파이썬은 문자열 조작을 위한 여러 연산자를 제공합니다. innot in 연산자는 부분 문자열 존재 여부를 확인하고, +는 문자열을 연결하며, *는 문자열을 반복합니다.

WebIDE 에서 string_operators.py 파일을 열고 다음 코드를 추가합니다.

## string_operators.py

## 'in' 연산자는 부분 문자열이 문자열 내에 존재하는지 확인합니다
print('e' in 'Hello')
print('x' in 'Hello')

## 'not in' 연산자는 'in'의 반대입니다
print('e' not in 'Hello')
print('x' not in 'Hello')

## 연결 (+) 은 두 문자열을 결합합니다
print('Hello' + ' ' + 'World')

## 반복 (*) 은 문자열을 주어진 횟수만큼 반복합니다
print('=' * 20)
print('Go! ' * 3)

파일을 저장하고 실행합니다.

python ~/project/string_operators.py
True
False
False
True
Hello World
====================
Go! Go! Go!

다음으로 이스케이프 문자를 살펴보겠습니다. 이들은 백슬래시 (\) 로 시작하는 특수 시퀀스로, 출력 불가능하거나 특수한 문자를 나타냅니다.

escape_characters.py 파일을 열고 다음 코드를 추가합니다.

## escape_characters.py

## 문자열 내에 따옴표를 포함하려면 \' 또는 \"를 사용합니다
print('It\'s a beautiful day.')
print("He said, \"Python is fun!\"")

## \n은 새 줄을 만듭니다
print("First line\nSecond line")

## \t는 수평 탭을 만듭니다
print("Column1\tColumn2\tColumn3")

## \\는 리터럴 백슬래시를 나타냅니다
print("This is a backslash: \\")

## 'r' 접두사가 붙은 원시 문자열 (raw string) 은 백슬래시를 리터럴 문자로 취급합니다.
## 이는 파일 경로 및 정규 표현식에 매우 유용합니다.
print("A normal string: C:\\Users\\new_folder")
print(r"A raw string: C:\Users\new_folder")

파일을 저장하고 실행합니다.

python ~/project/escape_characters.py
It's a beautiful day.
He said, "Python is fun!"
First line
Second line
Column1 Column2 Column3
This is a backslash: \
A normal string: C:\Users\new_folder
A raw string: C:\Users\new_folder

문자열 포매팅하기

이 단계에서는 파이썬에서 문자열을 포매팅하는 현대적이고 효과적인 방법을 학습합니다. 이는 변수와 표현식을 문자열 내에 삽입하여 동적이고 읽기 쉬운 출력을 생성하는 데 중요합니다.

+ 연산자를 사용하여 문자열을 연결할 수 있지만, 숫자와 같은 문자열이 아닌 유형과 혼합할 때는 str()을 사용하여 수동으로 변환해야 하므로 번거로울 수 있습니다.

파이썬은 더 나은 해결책을 제공합니다. 가장 일반적이고 권장되는 방법은 f-string (포맷된 문자열 리터럴) 을 사용하는 것입니다.

f-string 포매팅

Python 3.6 에서 도입된 f-string 은 표현식을 문자열 내에 삽입하는 간결하고 읽기 쉬운 방법을 제공합니다. 문자열 앞에 f 또는 F를 접두사로 붙이고 중괄호 {} 안에 표현식을 작성하기만 하면 됩니다.

string_formatting.py 파일을 열고 다음 코드를 추가합니다.

## string_formatting.py

name = "Alice"
age = 30

## f-string 을 사용하여 변수 삽입
greeting = f"Hello, my name is {name} and I am {age} years old."
print(greeting)

## 표현식을 직접 삽입할 수도 있습니다
print(f"In 5 years, I will be {age + 5} years old.")

스크립트를 저장하고 실행합니다.

python ~/project/string_formatting.py
Hello, my name is Alice and I am 30 years old.
In 5 years, I will be 35 years old.

포맷 지정자 (Format Specifiers)

f-string 은 또한 중괄호 안의 콜론 (:) 뒤에 오는 포맷 지정자를 사용하여 삽입된 값의 포매팅을 제어할 수 있도록 합니다.

string_formatting.py에 다음 예제를 추가합니다.

## string_formatting.py

## ... (이전 코드) ...

pi = 3.14159265

## float 을 소수점 이하 2 자리로 포맷팅
print(f"The value of pi is approximately {pi:.2f}")

## 숫자를 선행 0 으로 채워 너비 8 로 만들기
order_id = 45
print(f"Order ID: {order_id:08}")

## 주어진 공간 (너비 10) 내에서 텍스트 정렬
## < (왼쪽), ^ (가운데), > (오른쪽)
text = "Python"
print(f"'{text:<10}'")
print(f"'{text:^10}'")
print(f"'{text:>10}'")

## 천 단위 구분 기호로 쉼표 추가
large_number = 1234567890
print(f"A large number: {large_number:,}")

파일을 저장하고 다시 실행합니다.

python ~/project/string_formatting.py
Hello, my name is Alice and I am 30 years old.
In 5 years, I will be 35 years old.
The value of pi is approximately 3.14
Order ID: 00000045
'Python    '
'  Python  '
'    Python'
A large number: 1,234,567,890

str.format() 메서드

f-string 이전에는 str.format() 메서드가 문자열 포매팅을 위한 선호되는 방식이었습니다. 이는 문자열에 플레이스홀더 중괄호 {}를 배치한 다음 format() 메서드에 값을 전달하여 작동합니다.

string_formatting.py 끝에 이 예제를 추가합니다.

## string_formatting.py

## ... (이전 코드) ...

## str.format() 메서드 사용
item = "moon"
cost = 99.95
statement = "The {} costs {:.2f} dollars.".format(item, cost)
print(statement)

파일을 저장하고 실행하여 출력을 확인합니다.

python ~/project/string_formatting.py
Hello, my name is Alice and I am 30 years old.
In 5 years, I will be 35 years old.
The value of pi is approximately 3.14
Order ID: 00000045
'Python    '
'  Python  '
'    Python'
A large number: 1,234,567,890
The moon costs 99.95 dollars.

str.format()도 여전히 유용하지만, 일반적으로 f-string 이 가독성이 더 좋고 빠릅니다.

일반적인 문자열 메서드 탐색하기

마지막 단계에서는 문자열 객체에 대해 가장 일반적이고 유용한 내장 메서드 (built-in methods) 중 일부를 탐색합니다. 이러한 메서드는 대소문자 변경, 텍스트 찾기 및 바꾸기, 문자열을 리스트로 분할하는 등 다양한 작업을 수행합니다.

문자열은 불변 (immutable) 이므로, 이러한 메서드는 항상 새로운 문자열을 반환하며 원본 문자열은 수정하지 않는다는 점을 기억하십시오.

string_methods.py 파일을 열고 다음 코드를 추가하여 이러한 메서드가 작동하는 것을 확인합니다.

## string_methods.py

## 대소문자 변환 메서드
s1 = "Hello, World!"
print(f"Original: '{s1}'")
print(f"Upper case: '{s1.upper()}'")
print(f"Lower case: '{s1.lower()}'")
print(f"Title case: '{s1.title()}'")
print("-" * 20)

## 검색 및 바꾸기
s2 = "The quick brown fox jumps over the lazy dog."
print(f"Original: '{s2}'")
## 문자열이 특정 부분 문자열로 시작하거나 끝나는지 확인
print(f"Starts with 'The': {s2.startswith('The')}")
print(f"Ends with 'dog.': {s2.endswith('dog.')}")
## 부분 문자열의 인덱스 찾기 (-1 이면 찾을 수 없음)
print(f"Index of 'fox': {s2.find('fox')}")
## 부분 문자열을 다른 문자열로 바꾸기
s3 = s2.replace("brown", "red")
print(f"After replace: '{s3}'")
print("-" * 20)

## 공백 제거 (Stripping whitespace)
s4 = "    some whitespace    "
print(f"Original: '{s4}'")
## strip() 은 양쪽 끝에서 제거, lstrip() 은 왼쪽에서, rstrip() 은 오른쪽에서 제거
print(f"Stripped: '{s4.strip()}'")
print("-" * 20)

## 분할 및 결합 (Splitting and joining)
s5 = "one,two,three,four"
print(f"Original: '{s5}'")
## 구분자 (delimiter) 를 기준으로 문자열을 부분 문자열 리스트로 분할
parts = s5.split(',')
print(f"Split list: {parts}")
## 리스트의 요소들을 구분자를 사용하여 단일 문자열로 결합
s6 = " ".join(parts)
print(f"Joined string: '{s6}'")

파일을 저장하고 터미널에서 실행합니다.

python ~/project/string_methods.py

출력 결과는 다음과 같아야 합니다.

Original: 'Hello, World!'
Upper case: 'HELLO, WORLD!'
Lower case: 'hello, world!'
Title case: 'Hello, World!'
--------------------
Original: 'The quick brown fox jumps over the lazy dog.'
Starts with 'The': True
Ends with 'dog.': True
Index of 'fox': 16
After replace: 'The quick red fox jumps over the lazy dog.'
--------------------
Original: '    some whitespace    '
Stripped: 'some whitespace'
--------------------
Original: 'one,two,three,four'
Split list: ['one', 'two', 'three', 'four']
Joined string: 'one two three four'

이것들은 파이썬에서 사용할 수 있는 수많은 문자열 메서드 중 일부에 불과합니다. 이 메서드들은 텍스트 데이터를 처리하고 조작하는 강력한 도구를 제공합니다.

요약

본 랩 (lab) 에서는 파이썬에서 문자열을 다루는 기본 개념을 학습했습니다. 문자열 생성 방법과 불변성 (immutable nature) 을 이해하는 것부터 시작했습니다. 양수 및 음수 인덱싱을 사용하여 개별 문자에 접근하고, 시작 (start), 끝 (end), 단계 (step) 매개변수를 사용하여 슬라이싱 (slicing) 으로 부분 문자열을 추출하는 연습을 했습니다.

그런 다음 연결 (+) 및 반복 (*) 을 위한 문자열 연산자 (operators) 를 탐색했으며, 문자열에 특수 문자를 포함하기 위해 이스케이프 문자 (escape characters) 를 사용하는 방법을 배웠습니다. f-string 의 강력함과 가독성 및 포맷 지정자 (format specifiers) 에 중점을 둔 최신 문자열 포매팅 기술을 숙달했으며, str.format() 메서드도 살펴보았습니다. 마지막으로 upper(), lower(), replace(), strip(), split(), join()과 같은 일반적인 문자열 메서드를 사용하여 필수적인 텍스트 조작 작업을 수행하는 연습을 했습니다.