Chapter 09-1~09-2 문자열 다루기, 문자열 메서드
파이썬과 문자열
문자열은 작은따옴표나 큰따옴표로 감싸서 만듭니다. 다음은 작은따옴표로 grail, a scratch라는 문자열 데이터를 만들어 변수 word, sent에 저장한 것입니다.
word = 'grail' sent = 'a scratch' |
인덱스로 문자열 추출하기
데이터프레임에서 인덱스를 이용하여 원하는 데이터를 추출했던 것을 기억하나요? 문자열도 인덱스를 사용하여 추출할 수 있습니다. 문자는 길이가 1인 문자열로 생각하면 됩니다. 다음은 문자열과 인덱스를 함께 나타낸 표입니다. 간단하게 살펴보고 바로 실습으로 넘어갈까요?
문자열 grail과 인덱스
인덱스 | 0 | 1 | 2 | 3 | 4 |
문자열 | g | r | a | i | l |
음수 인덱스 | -5 | -4 | -3 | -2 | -1 |
문자열 a scratch와 인덱스
인덱스 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
문자열 | a | s | c | r | a | t | c | h | |
음수 인덱스 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
문자열 추출하기
1. 각 문자열의 첫 번째 문자는 다음과 같은 방법으로 추출합니다.
word = 'grail' sent = 'a scratch' print(word[0]) g print(sent[0]) a |
2. 인덱스 슬라이싱을 사용하면 여러 개의 문자를 한 번에 추출할 수 있습니다. 다음은 인덱스 슬라이싱을 사용하여 0~2번째 인덱스의 문자를 추출한 것입니다. 이때 대괄호에 지정한 왼쪽 범위(0)는 포함하고 오른쪽 범위(3)는 포함하지 않습니다. 즉, 인덱스가 0, 1, 2인 문자를 추출합니다.
print(word[0:3]) gra |
3. 음수를 사용해도 문자열을 추출할 수 있습니다. 만약 인덱스를 -1로 지정하여 문자열을 추출하면 마지막 문자가 추출됩니다. 다음은 다양한 방법으로 음수 범위의 인덱스 슬라이싱을 한 것입니다.
print(sent[-1]) h print(sent[-9:-8]) a print(sent[0:-8]) a |
* 전체 문자열을 추출할 때 음수를 사용하면 안 됩니다.
문자열의 마지막 문자를 추출하려면 인덱스를 -1로 지정하면 됩니다. 그런데 전체 문자열을 추출하기 위해 인덱스 슬라이싱의 범위를 [0:-1]로 지정하면 마지막 문자는 추출되지 않습니다. 왜 그럴까요? 바로 인덱스 슬라이싱의 오른쪽 범위로 지정한 값은 문자열 추출 범위에서 제외되기 때문입니다. 그러면 전체 문자열을 추출하려면 어떻게 해야 할까요? 이런 경우에는 len 메서드를 사용하여 문자열의 길이를 오른쪽 범위로 지정하면 됩니다.
print(sent[2:-1]) scratc print(sent[-7:-1]) scratc s_len = len(sent) print(s_len) 9 print(sent[2:s_len]) scratch |
전체 문자열 추출하기
만약 인덱스 슬라이싱을 할 때 문자열 범위를 왼쪽 범위나 오른쪽 범위 중 하나만 지정하면 어떻게 될까요? 왼쪽 범위가 비어 있으면 문자열의 철 번째 위치부터 문자열을 추출합니다. 반대로 오른쪽 범위가 비어 있으면 문자열의 마지막 위치까지 문자열을 추출합니다. 즉, word[0:3]과 word[:3]은 같은 범위의 문자열을 추출합니다. 이런 성질을 이용하여 전체 문자열을 추출해 보겠습니다.
왼쪽이나 오른쪽 범위를 지정하지 않고 문자열 추출하기
1. 왼쪽 범위를 비우고 문자열을 추출하면 다음과 같이 됩니다.
print(word[0:3]) gra print(word[:3]) gra |
2. 만약 오른쪽 범위를 비우면 문자열의 마지막 위치까지 문자열을 추출합니다.
print(sent[2:len(sent)]) scratch print(sent[2: ]) scratch |
3. 양쪽을 모두 비우면 전체 문자열을 추출합니다.
print(sent[ : ]) scratch |
4. 만약 문자열을 일정한 간격으로 건너뛰며 추출해야 한다면 콜론(:)을 하나 더 추가하여 추출 간격을 지정하면 됩니다. 오른쪽은 전체 문자열을 추출하되 다음 추출 문자는 자신을 포함하여 거리가 2인 인덱스의 문자를 추출한 것입니다(1칸씩 건너뛰며 추출합니다).
print(sent[::2]) asrth |
지금까지 인덱스 슬라이싱으로 문자열을 추출하는 방법을 알아보았습니다. 그런데 문자열이 너무 길어서 내가 원하는 문자가 몇 번째 인덱스에 있는지 파악하기 어렵거나 문자열에 포함된 소문자를 모두 대문자로 바꾸고 싶다면 어떻게 해야 할까요? 이런 경우에는 문자열 메서드를 사용하면 됩니다. 자주 사용하는 문자열 메서드와 간단한 실습 코드를 다음 표에 정리했습니다. 문자열 메서드 표 아래에 있는 실습 코드를 정리한 표도 함께 읽어보세요.
문자열 메서드
메서드 | 설명 |
capitalize | 첫 문자를 대문자로 변환합니다. |
count | 문자열의 개수를 반환합니다. |
startswith | 문자열이 특정 문자로 시작하면 참이 됩니다. |
endswith | 문자열이 특정 문자로 끝나면 참이 됩니다. |
find | 찾을 문자열의 첫 번째 인덱스를 반환합니다. 실패 시 -1을 반환합니다. |
index | find 메서드와 같은 역할을 수행하지만 실패 시 ValueError를 반환합니다. |
isalpha | 모든 문자가 알파벳이면 참입니다. |
isdecimal | 모든 문자가 숫자면 참입니다. |
isanum | 모든 문자가 알파벳이거나 숫자면 참입니다. |
lower | 모든 문자를 소문자로 변환합니다. |
upper | 모든 문자를 대문자로 변환합니다. |
replace | 문자열의 문자를 다른 문자로 교체합니다. |
strip | 문자열의 맨 앞과 맨 뒤에 있는 빈 칸을 제거합니다. |
split | 구분자를 지정하여 문자열을 나누고, 나눈 값들의 리스트를 반환합니다. |
partiton | split 메서드와 비슷한 역할을 수행하지만 구분자도 반환합니다. |
center | 지정한 너비로 문자열을 늘이고 문자열을 가운데 정렬합니다. |
zfill | 문자열의 빈 칸은 '0'으로 채웁니다. |
파이썬 문자열 메서드 - 실습 코드
실습 코드 | 실행 결과 |
"black knight".capitalize( ) | 'Black knight' |
"It's just a flesh wound!".count('u') | 2 |
"Halt! Who goes ther?". startswith('Halt') | True |
"coconut".endswith('nut') | True |
"It's just a flesh wound!".find('u') | 7 |
"It's just a flesh wound!".index('scratch') | ValueError |
"old woman".isalpha( ) | False |
"37".isdecimal( ) | True |
"I'm 37".isalnum( ) | False |
"Black Knight".lower( ) | 'black knight' |
"Black Knight".upper( ) | 'BLACK KNIGHT' |
"flesh wound!".replace('flesh wound', 'scratch') | 'scratch!' |
" I'm not dead. ".strip( ) | "I'm not dead." |
"NI! NI! NI! NI!".split(sep=' ') | ['NI!', 'NI!', 'NI!', 'NI!'] |
"3, 4 partition(',') | ('3', ',', '4') |
"nine".center(10) | ' nine ' |
"9".zfill(with=5) | '00009' |
join, splitlines, replace 메서드 실습하기
1. join 메서드
join 메서드는 문자열을 연결하여 새로운 문자열을 반환하는 메서드입니다. 다음은 분리된 좌표 데이터(40°, 46', 52.837", ...)를 합친 것입니다. 이때 join 메서드 앞에 문자(' ')를 지정하면 해당 문자를 단어 사이에 넣어 연결해 줍니다.
d1 = '40˚' m1 = "46'" s1 = '52.837"' u1 = 'N' d2 = '73˚' m2 = "58'" s2 = '26.302"' u2 = 'W' coords = ' '.join([d1, m1, s1, u1, d2, m2, s2, u2]) print(coords) 40° 46' 52.837" N 73° 58' 26.302" W |
2. splitlines 메서드
이번에는 splitlines 메서드에 대해 알아볼까요? splitlines 메서드는 여러 행을 가진 문자열을 분리한 다음 리스트로 반환합니다. multi_str에 저장된 문자열을 splitlines 메서드로 분리하면 다음과 같이 됩니다.
multi_str = """Guard: What? Ridden on a horse? King Arthur: Yes! Guard: You're using coconuts! King Arthur:What? Guard: You've got ... coconut[s] and you're bangin' 'em together.'""" print(multi_str) Guard: What? Ridden on a horse? King Arthur: Yes! Guard: You're using coconuts! King Arthur: What? Guard: You've got ... coconut[s] and you're bangin' 'em together. multi_str_split = multi_str.splitlines( ) print(multi_str_split) ['Guard: What? Ridden on a horse?', 'King Arthur: Yes!', "Guard: You're using coconuts!", 'King Arthur: What?', "Guard: You've got ... coconut[s] and you're bangin' 'em together. "] |
3. 인덱스 슬라이싱을 응용하면 특정 문자열만 가져올 수도 있습니다. 다음은 Guard의 대사만 가져온 것입니다.
guard = multi_str_split[::2] print(guard) ['Guard: What? Ridden on a horse?', "Guard: You're using coconuts!", "Guard: You've got ... coconut[s] and you're bangin' 'em together. "] |
4. replace 메서드
조금 더 나아가 볼까요? 만약 Guard의 대사에서 'Guard: '라는 문자열을 빼고 싶다면 어떻게 해야 할까요? 그럴 때는 문자열을 치환해 주는 replace 메서드를 사용하면 됩니다. 다음과 같이 "Guard: "를 ""로 치환하여 Guard: 를 없앴습니다.
guard = multi_str.replace("Guard: ", "").splitlines( )[::2] print(guard) ['What? Ridden on a horse?', "You're using coconuts!", "You've got ... coconut[s] and you're bangin' 'em together. "] |
출처 : "판다스 입문"