소개
본 실습에서는 Python 에서 문자열을 조작하는 기본적인 기술들을 탐구합니다. 문자열은 가장 흔한 데이터 타입 중 하나이며, 이를 효과적으로 다루는 방법을 아는 것은 모든 Python 프로그래머에게 필수적인 기술입니다. 기본 정의, 특수 문자 사용, 여러 줄 문자열 생성부터 부분 문자열 접근, 내용 확인, 대소문자 변경, 검색, 분할, 텍스트 포매팅과 같은 고급 연산까지 모든 것을 다룰 것입니다. 이 실습이 끝날 때쯤이면 Python 프로그램에서 텍스트 데이터를 처리하는 데 탄탄한 기반을 갖추게 될 것입니다.
이스케이프 문자 및 여러 줄 문자열
이 단계에서는 문자열 내의 특수 문자를 처리하는 방법, 이러한 특수 문자를 무시하는 문자열을 생성하는 방법, 그리고 여러 줄에 걸쳐 있는 문자열을 정의하는 방법을 배웁니다.
먼저, **이스케이프 문자 (escape characters)**에 대해 살펴보겠습니다. 이스케이프 문자는 백슬래시 (\) 뒤에 삽입하려는 문자가 오는 형태입니다. 예를 들어, \n은 줄 바꿈 (newline) 을 나타내고, \'는 작은따옴표 (single quote) 를 나타냅니다.
참고: WebIDE(VS Code 와 유사) 사용이 익숙하지 않다면, 이 실습에서 먼저 학습하십시오.
왼쪽 파일 탐색기에서 main.py 파일을 엽니다. 다음 코드를 파일에 추가합니다.
## Escape characters: use backslash to insert special characters
## \n = newline, \' = single quote
print("Hello there!\nHow are you?\nI\'m doing fine.")
이제 터미널을 열고 아래 명령어를 실행하여 스크립트를 실행합니다. 터미널 패널에서 + 아이콘을 클릭하여 새 터미널을 열 수 있습니다.
python3 main.py
줄 바꿈과 작은따옴표가 올바르게 삽입된 출력을 보게 될 것입니다.
Hello there!
How are you?
I'm doing fine.
다음으로, **원시 문자열 (raw strings)**을 살펴보겠습니다. r 접두사가 붙은 원시 문자열은 모든 이스케이프 문자를 무시하고 문자열에 나타나는 모든 백슬래시를 그대로 출력합니다. 이는 정규 표현식 (regular expressions) 이나 파일 경로를 다룰 때 특히 유용합니다.
main.py의 내용을 다음 코드로 교체합니다.
## Raw string (r prefix): treats backslashes as literal characters
print(r"Hello there!\nHow are you?\nI\'m doing fine.")
스크립트를 다시 실행합니다.
python3 main.py
출력에서 \n과 \'가 이제 리터럴 문자 (literal characters) 로 처리되는 것을 확인하십시오.
Hello there!\nHow are you?\nI\'m doing fine.
마지막으로, 세 개의 따옴표 (""" 또는 ''') 를 사용하여 **여러 줄 문자열 (multiline strings)**을 생성할 수 있습니다. 이는 서식을 유지하면서 여러 줄에 걸친 문자열을 정의하는 편리한 방법입니다.
main.py의 내용을 이 예제로 교체합니다.
print(
"""Dear Alice,
Eve's cat has been arrested for catnapping,
cat burglary, and extortion.
Sincerely,
Bob"""
)
스크립트를 실행합니다.
python3 main.py
출력은 서식이 지정된 여러 줄 메시지가 될 것입니다.
Dear Alice,
Eve's cat has been arrested for catnapping,
cat burglary, and extortion.
Sincerely,
Bob
문자열 인덱싱 및 슬라이싱
이 단계에서는 인덱싱 (indexing) 과 슬라이싱 (slicing) 을 사용하여 개별 문자에 접근하고 부분 문자열 (substring) 을 추출하는 방법을 배웁니다.
Python 의 문자열은 시퀀스 (sequence) 이므로 인덱스를 사용하여 문자열의 일부에 접근할 수 있습니다. 인덱싱은 첫 번째 문자부터 0 으로 시작합니다.
H e l l o w o r l d !
0 1 2 3 4 5 6 7 8 9 10 11
main.py 파일을 비우고 다음 코드를 추가하여 문자열을 정의합니다.
spam = 'Hello world!'
첫 번째 문자 ('H') 에 접근하려면 인덱스 0을 사용합니다. 다섯 번째 문자 ('o') 에 접근하려면 인덱스 4를 사용합니다. 음수 인덱스를 사용하여 문자열 끝에서부터 셀 수도 있으며, -1은 마지막 문자를 참조합니다.
인덱싱이 어떻게 작동하는지 확인하기 위해 다음 print 문을 main.py에 추가합니다.
spam = 'Hello world!'
## String indexing: access characters by position (0-based)
print(spam[0]) ## 첫 번째 문자 반환
print(spam[4]) ## 다섯 번째 문자 반환
print(spam[-1]) ## 마지막 문자 반환
스크립트를 실행합니다.
python3 main.py
접근한 개별 문자들이 출력에 나타날 것입니다.
H
o
!
**슬라이싱 (Slicing)**을 사용하면 문자열의 일부, 즉 부분 문자열을 추출할 수 있습니다. 구문은 [start:end]이며, 이는 start 인덱스부터 시작하여 end 인덱스 직전까지의 문자를 추출합니다.
슬라이싱을 연습해 봅시다. main.py의 내용을 다음 코드로 교체합니다. 문자열을 슬라이싱하는 몇 가지 다른 방법을 살펴보겠습니다.
spam = 'Hello world!'
## String slicing: extract substring using [start:end] syntax
print(spam[0:5]) ## 인덱스 0 부터 4 까지의 문자 반환
print(spam[:5]) ## start 인덱스를 생략하면 0 으로 기본 설정됨
print(spam[6:]) ## end 인덱스를 생략하면 문자열 끝까지 기본 설정됨
print(spam[::-1]) ## step 을 -1 로 설정하면 문자열이 역순이 됨
스크립트를 실행합니다.
python3 main.py
슬라이싱으로 생성된 다양한 부분 문자열을 관찰하십시오.
Hello
Hello
world!
!dlrow olleH
문자열 멤버십 및 대소문자 메서드
이 단계에서는 문자열 내에 부분 문자열이 존재하는지 확인하는 방법과 문자열의 대소문자를 변경하고 검증하는 방법을 학습합니다.
in 및 not in 연산자는 문자열 멤버십을 확인하는 데 사용됩니다. 이들은 부울 값 (True 또는 False) 을 반환합니다.
main.py 파일을 비우고 다음 코드를 추가하여 이 연산자들을 테스트합니다. 비교는 대소문자를 구분한다는 점에 유의하십시오.
## The 'in' and 'not in' operators
print('Hello' in 'Hello World')
print('HELLO' in 'Hello World')
print('cats' not in 'cats and dogs')
스크립트를 실행하여 부울 결과를 확인합니다.
python3 main.py
True
False
False
Python 은 문자열의 대소문자를 변경하기 위한 여러 메서드도 제공합니다. upper(), lower(), title() 메서드는 각각 모든 대문자, 모든 소문자, 또는 제목 형식 (각 단어의 첫 글자가 대문자) 의 새 문자열을 반환합니다.
main.py의 내용을 다음으로 교체합니다.
greet = 'Hello world!'
print(greet.upper())
print(greet.lower())
print(greet.title())
스크립트를 실행합니다.
python3 main.py
변환된 문자열을 볼 수 있습니다.
HELLO WORLD!
hello world!
Hello World!
문자열이 이미 특정 대소문자인지 확인하려면 isupper() 및 islower() 메서드를 사용할 수 있습니다. 이 메서드들은 문자열 내의 모든 대소문자 문자가 지정된 대소문자이며 적어도 하나의 대소문자 문자가 있을 경우 True를 반환합니다.
main.py의 내용을 다음 예시로 교체합니다.
spam = 'Hello world!'
print(spam.islower())
print('HELLO'.isupper())
## This is true because non-letter characters are ignored
print('abc12345'.islower())
## This is false because there are no cased characters
print('12345'.islower())
스크립트를 실행하여 각 문자열의 대소문자를 확인합니다.
python3 main.py
False
True
True
False
문자열 검색 및 분할
이 단계에서는 문자열이 특정 부분 문자열로 시작하거나 끝나는지 확인하는 방법, 문자열 리스트를 단일 문자열로 결합하는 방법, 그리고 문자열을 부분 문자열 리스트로 분할하는 방법을 학습합니다.
startswith() 및 endswith() 메서드는 문자열의 시작 또는 끝을 확인하는 데 유용합니다. 이들은 True 또는 False를 반환합니다.
main.py를 비우고 다음 코드를 추가합니다.
print('Hello world!'.startswith('Hello'))
print('Hello world!'.endswith('world!'))
print('abc123'.startswith('abcdef'))
스크립트를 실행하여 결과를 확인합니다.
python3 main.py
True
True
False
join() 메서드는 구분자 (separator) 문자열에서 호출되며 반복 가능한 객체 (iterable, 리스트와 같은) 를 인수로 받습니다. 이 메서드는 반복 가능한 객체의 요소들을 단일 문자열로 결합하며, 각 요소 사이에 구분자를 삽입합니다.
join()이 어떻게 작동하는지 확인하기 위해 main.py의 내용을 다음 예시로 교체합니다.
## Join with a comma and space separator
print(', '.join(['cats', 'rats', 'bats']))
## Join with a space separator
print(' '.join(['My', 'name', 'is', 'Simon']))
스크립트를 실행합니다.
python3 main.py
cats, rats, bats
My name is Simon
split() 메서드는 join()과 반대 작업을 수행합니다. 이 메서드는 문자열에서 호출되어 문자열을 부분 문자열 리스트로 나눕니다. 기본적으로 공백 (whitespace) 을 기준으로 분할하지만, 특정 구분자 (delimiter) 를 지정할 수도 있습니다.
문자열 분할을 연습하기 위해 main.py의 내용을 다음 코드로 교체합니다.
## Split by default whitespace
print('My name is Simon'.split())
## Split by a specific delimiter 'ABC'
print('MyABCnameABCisABCSimon'.split('ABC'))
스크립트를 실행하여 결과 리스트를 확인합니다.
python3 main.py
['My', 'name', 'is', 'Simon']
['My', 'name', 'is', 'Simon']
문자열 정렬 및 정리
이 단계에서는 문자열 정렬을 포맷하는 방법과 문자열의 시작 또는 끝에서 공백과 같은 원치 않는 문자를 제거하는 방법을 학습합니다.
Python 은 주어진 너비 내에서 텍스트를 정렬하는 메서드인 rjust() (오른쪽 정렬), ljust() (왼쪽 정렬), 및 center()를 제공합니다. 이 메서드들은 패딩된 새 문자열을 반환합니다.
main.py 파일을 비우고 다음 코드를 추가합니다.
print('Hello'.rjust(10))
print('Hello'.ljust(10))
print('Hello'.center(20))
스크립트를 실행하여 정렬된 텍스트를 확인합니다. 출력에서 작은따옴표는 패딩을 시각화하는 데 도움이 됩니다.
python3 main.py
Hello
Hello
Hello
선택적 두 번째 인수를 제공하여 공백 이외의 채움 문자 (fill character) 를 지정할 수도 있습니다. main.py의 내용을 다음으로 교체합니다.
print('Hello'.rjust(20, '*'))
print('Hello'.center(20, '='))
스크립트를 다시 실행합니다.
python3 main.py
***************Hello
=======Hello========
문자열을 정리하기 위해 strip(), rstrip(), 및 lstrip() 메서드를 사용할 수 있습니다. 이들은 문자열 끝에서 문자를 제거하는 데 사용됩니다. 기본적으로 공백 문자 (스페이스, 탭, 줄 바꿈) 를 제거합니다.
main.py의 내용을 다음 예시로 교체합니다.
spam = ' Hello World '
print(spam.strip()) ## 양쪽 끝에서 제거
print(spam.lstrip()) ## 왼쪽에서 제거
print(spam.rstrip()) ## 오른쪽에서 제거
스크립트를 실행하여 정리된 문자열을 확인합니다.
python3 main.py
Hello World
Hello World
Hello World
이 메서드들에 문자열 인수를 전달하여 제거할 문자를 지정할 수도 있습니다. 해당 메서드는 문자열 끝에 있는 인수로 전달된 모든 문자를 제거합니다.
마지막으로 main.py의 내용을 교체합니다.
spam = 'SpamSpamBaconSpamEggsSpamSpam'
## Removes all characters 'S', 'p', 'a', 'm' from the ends
print(spam.strip('ampS'))
스크립트를 실행합니다.
python3 main.py
출력은 바깥쪽 "Spam" 부분이 제거되고 문자열의 중앙 부분이 남았음을 보여줍니다.
BaconSpamEggs
요약
본 랩 (lab) 에서는 Python 에서 문자열 조작의 필수 기술들을 숙달했습니다. 더 나은 텍스트 표현을 위해 이스케이프 문자 (escape characters) 사용법과 여러 줄 문자열 (multiline strings) 생성을 배웠습니다. 인덱싱 (indexing) 과 슬라이싱 (slicing) 을 사용하여 문자열의 일부에 접근하는 것을 연습했습니다. 또한 멤버십 확인 (in, not in), 대소문자 변경 (upper(), lower()), 대소문자 유효성 검사 (isupper(), islower()), 검색 (startswith(), endswith()), 결합 및 분할, 그리고 마지막으로 텍스트 포맷팅 및 정리 (rjust(), strip()) 를 위한 강력한 문자열 메서드들을 탐구했습니다. 이러한 기술들은 Python 에서 텍스트 처리를 포함하는 모든 작업에 기본이 됩니다.



