본문 바로가기
파이썬/기초 문법

[파이썬]문자열 함수 - 값 찾기, 개수 세기, 합치기, 나누기

by 코키드 Cokid 2022. 9. 26.
반응형

파이썬은 문자열 자료형에 사용할 수 있는 다양한 내장 함수를 가지고 있다.

이번 글에서는 문자의 위치를 알려주는 함수 find, index와 문자열에서 특정 문자의 개수를 세는 count 함수, 문자열을 합쳐주고 구분하는 join 함수에 대해 포스팅한다.

함수는 문자열 변수에 '.'를 붙여 사용한다.

문자열 관련 함수들을 보려면 dir(str)을 터미널 창에 입력하면 된다.

>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 
'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

 

문자의 위치를 알려주는 함수 -  find, index

find 함수로 문자 위치 찾기

>>> a = "Python"
>>> a.find("P")
0   
>>> a.find('h')
3
>>> a.find('a') # 해당 문자가 없을 경우 -1 반환
-1

find 함수를 사용하면 해당 문자의 인덱스를 반환한다.

문자열에 찾고자 하는 문자가 없을 경우에는 -1을 반환한다.

 

찾는 문자가 중복되어 있는 경우

>>> a = 'AAABBBCCCCDDD' # 중복된 문자
>>> a.find('A') # 첫 번째 A의 위치 출력
0
>>> a.find('C') # 첫 번째 C의 위치 출력
6

'AAABBBCCCCDDD' 문자열에서 find 함수로 'A'를 찾으면 처음으로 나온 'A'의 위치를 반환한다.

 

한 문자가 아닌 문자열 찾기

>>> a = 'We study hard!'
>>> a.find('study') # 'study'가 시작되는 위치 반환
3

한 문자가 아닌 문자열을 찾는 것도 가능하다. 찾고자 하는 문자열이 시작되는 위치를 반환한다.

 

>>> a = 'AAABBBCCCCDDD'
>>> a.find('AA') # 첫 번째 'AA' 위치 반환
0
>>> a.find('BB') # 첫 번째 'BB' 위치 반환
3

위 예시를 보면 'AAABBBCCCCDDD'에서 'AA'를 찾을 때, 'AAABBBCCCCDDD'와 'AAABBBCCCCDDD'의 케이스로 생각해 볼 수 있다. 이경우 역시 처음으로 나오는 'AA'의 위치를 반환한다.

 

find함수 응용 - 슬라이싱과 함께 사용하기

>>> sm = '871225-1234567'  
>>> sm.find('-')
6
>>> sm[:6]
'871225'
>>> sm[6+1:]
'1234567'

find 함수를 슬라이싱과 함께 사용해보자. 주민등록번호 앞자리와 뒷자리를 분리하는 코드를 짜 보자.

주민번호의 앞자리와 뒷자리는 '-' 문자로 구분된다. find 함수로 '-' 문자의 위치를 찾고 그 위치를 기준으로 슬라이싱 한다.

이렇게 문자열에서 정보를 구분해주는 문자가 있으면 find와 슬라이싱으로 손쉽게 정보를 분리할 수 있다.

 

오른쪽부터 찾아주는 함수 rfind

>>> a = 'AAABBBCCCCDDD'
>>> a.rfind('D') # 오른쪽에서 처음 나오는 'D'의 위치 반환
12
>>> a.rfind('AA') # 오른쪽에서 처음 나오는 'AA'의 위치 반환
1

rfind 함수를 이용하면 오른쪽에서부터 위치를 찾을 수 있다. 사용법은 find 함수와 동일하다.

rfind 함수로 'AA'를 찾으면 'AAABBBCCCCDDD'와 'AAABBBCCCCDDD' 두 경우에서 오른쪽 'AA'가 처음 등장하는 인덱스 1을 반환한다.

 

>>> location = 'C:\\Users\\mine\\Desktop\\folder\\my_selfie.jpg' # 셀카 저장된 위치
>>> location.rfind('\\') # '\'(백슬래쉬)의 위치를 찾아 파일명 확인
28
>>> print(location[28+1:]) # 파일명 출력
my_selfie.jpg

rfind 함수를 응용하여 파일의 이름을 출력해보자. 'my_selfie.jpg'라는 파일의 위치가 location 변수에 저장되어 있다.

백슬래쉬(\)로 파일의 경로가 구분되어 있는데, 우리가 알고자 하는 것은 오른쪽에서 처음 나오는 백슬래쉬이다.

이때 rfind 함수를 이용하면 파일명 바로 앞의 백슬래쉬가 28번째에 위치한 걸 알 수 있다.

우리가 필요한 건 백슬래쉬 뒤부터의 문자이기 때문에 location[28+1:]로 슬라이싱 하면 파일명만 추출할 수 있다.

 

index 함수로 문자 위치 찾기

>>> a = 'Python' 
>>> a.index('P') 
0
>>> a.index('h') 
3
>>> a.index('a') # 해당 문자가 문자열에 없을 시 에러 출력
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

기본적으로 index 함수는 find 함수와 사용법이 동일하다. 다만 index 함수에서는 찾고자 하는 문자가 문자열에 없을 경우 -1을 반환하지 않고 에러가 발생한다. rfind 함수처럼 rindex로 오른쪽에서부터 위치를 찾는 것도 가능하다.

 

문자열에서 문자 개수 확인하기 - count

count 함수로 문자  개수 세기

>>> a = 'Studying Python'
>>> a.count('S')
1
>>> a.count('y')
2

count 함수를 통해 문자열에 해당 문자의 개수를 알 수 있다.

 

찾는 문자가 중복되어 있는 경우

>>> a = 'AAABBBCCCCDDD'
>>> a.count('C')
4
>>> a.count('AA') # 첫 번째 'AA'의 개수만 출력
1
>>> a.count('CC') # 첫 번째와 두 번째 'CC'의 개수 출력

찾는 문자가 중복된 경우를 보자.

 'AAABBBCCCCDDD'에서 'AAABBBCCCCDDD'와 'AAABBBCCCCDDD' 두 경우를 생각해 볼 수 있는데, count 함수에서는 'AAABBBCCCCDDD'에서 첫 번째 'AA'를 찾고 'AAABBBCCCCDDD' 의 'AA'는 인식하지 못한다.

count 함수는 'AAABBBCCCCDDD'로 인식하여 첫 'AA'를 카운트 한 뒤 온전한 'AA'가 없기 때문이다.

'CC'를 찾을 때는 'AAABBBCCCCDDD'에서 'CC'를 한 번 찾고 난 뒤에도 'AAABBBCCCCDDD'에서 온전한 'CC'가 있기 때문에 2개로 카운트하는 모습이다.

 

문자를 합치고 나누기 - join, split

문자를 합쳐주는 join 함수

>>> a = 'Python'
>>> '_'.join(a) # 문자 '_' 삽입
'P_y_t_h_o_n'

위 코드를 보면 문자열 자료형에서 join 함수는 사실 문자를 합치는 것보다 문자를 삽입하는 기능을 한다.

다만 join 함수는 앞으로 다룰 리스트와 튜플에서 각 요소들을 합치는 역할을 하기 때문에 문자를 합치는 함수로 소개했다.

 

리스트에서 join 함수 사용하기

사실 join 함수는 튜플이나 리스트에서 더 많이 사용되는 것 같다.

아직 튜플과 리스트에 대해서는 포스팅하지 않았으니, 대충 눈으로만 보자.

>>> a = ['H', 'e', 'l', 'l', 'o']
>>> ''.join(a)
'Hello'

join 함수를 통해 리스트 a에 있는 각 요소들을 합쳐 문자열로 만들 수 있다.

 

>>> birth = ['1989', '12', '25'] 
>>> '-'.join(birth) # 리스트의 요소들을 '-' 문자로 합침
'1989-12-25'

>>> birth = [1989, 12, 25]
>>> '-'.join(birth) # 숫자형에 사용 시 에러 발생
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found

위 예시를 보자. join 함수를 사용할 때 리스트의 각 요소들 사이에 문자열을 삽입할 수 있다.

첫 번째 예시는 생년월일이 저장된 리스트를 join함수로 불러 '-' 문자로 구분하여 합친 모습이다.

단 join 함수는 문자열 자료형에만 적용이 된다. 두 번째 예시에서 보듯 리스트가 숫자형으로 돼 있으면 에러가 발생한다.

 

split 함수로 문자열 나누기

>>> a = 'P_y_t_h_o_n'
>>> a.split('_') # '_'를 기준으로 나누기
['P', 'y', 't', 'h', 'o', 'n'] 

>>> birth = '1989-12-25'     
>>> birth.split('-') # '-'를 기준으로 나누기
['1989', '12', '25']

>>> b = 'Hello, my name is Cokid'
>>> b.split() # 구분자가 없을 경우에는 공백을 기준으로 나눈다
['Hello,', 'my', 'name', 'is', 'Cokid']

>>> long_str = '''
... Hello
... my
... name
... is 
... Cokid
... '''
>>> long_str.split() # 엔터를 기준으로 나눌 수도 있다
['Hello', 'my', 'name', 'is', 'Cokid']

join 함수로 리스트의 문자를 합칠 수 있는 반면 split 함수는 문자열을 쪼개서 리스트로 만들 수 있다.

문자열을 구분할 수 있는 특정 문자를 기준으로 문자열을 쪼갤 수 있다.

만약 괄호 안을 공백으로 남겨둘 시에 스페이스나 탭, 엔터 등의 공백을 기준으로 문자열을 나눈다.

 

 

 

 

2022.09.23 - [파이썬/기초 문법] - [Python]문자열 자료형(str) 만들기 & 이스케이프 코드

2022.09.24 - [파이썬/기초 문법] - [파이썬]문자열(Strging)의 인덱싱(Indexing)과 슬라이싱(Slicing)

2022.09.25 - [파이썬/기초 문법] - [Python]문자열 포매팅(Formatting) - 포맷 코드(%s)&format 함수&f 포매팅

반응형

댓글