본문 바로가기
컴퓨터/Python

파이썬 split() 함수 및 rsplit() 함수

by ehong 2019. 11. 4.

 

세종 말뭉치를 활용하는 프로그램을 짜고 있는데, 초반에 split() 함수로 스트링을 분리했다가 한참이 지나서야 오류가 있다는 것을 알게 됐다.

 

일단 세종 말뭉치는 예를 들어 -

 

집은 창작의 원천이라는 그는 옷 못지않게 공간이 주는 미학을 중요시해 왔다.
집/NNG + 은/JX + 창작/NNG + 의/JKG + 원천/NNG + 이/VCP + 라는/ETM ...

 

처럼 문장을 형태소 단위로 분석해서 해당 형태소의 품사를 붙여 놓은 텍스트 데이터라고 할 수 있는데,

형태소와 품사를 분리하기 위해서 split()를 썼었다.

 

word = '가을/NNG'
morpheme_and_tag = word.split('/')
print(morpheme_and_tag)

# 실행 결과
['가을', 'NNG']

 

문제는 형태소-태그 쌍 중에 '//SP'가 있다는 것, '//SP'는 '/'가 SP(쉼표, 가운뎃점, 콜론, 빗금 중 하나)라는 뜻이다.

여기에 split('/')를 적용하면?

 

str1 = "//SF"
result = str1.split('/')
print(result)

# 실행 결과:
['', '', 'SF']

 

결과에서 볼 수 있듯이 /이 손실되어 버리는데다 리스트의 길이도 2가 아닌 3이 된다.

 

그러면 해결책은? rsplit() 함수!

split()는 앞에서부터 delimiter(여기선 '/')를 기준으로 스트링을 나누는 반면, rsplit()는 뒤에서부터 스트링을 나눈다. 그러면 rsplit를 사용하면 결과가 제대로 나올까?

 

str1 = "//SF"
result = str1.rsplit('/')
print(result)

# 실행 결과:
['', '', 'SF']

 

똑같다. delimiter 외에도 두 번째 파라미터로 최대 분할 횟수를 입력하지 않았기 때문이다.

즉, '//SF'를 '/' 기준으로 한번 나누면 ['/', 'SF']가 되고, 이를 다시 한번 나누면 ['', '', 'SF']가 된다. 그러면 최대 분할 횟수로 1을 입력하면 된다.

 

str1 = "//SF"
result = str1.rsplit('/', 1)
print(result)

# 실행 결과:
['/', 'SF']

 

깔끔하게 성공!

'컴퓨터 > Python' 카테고리의 다른 글

TypeError: 'type' object does not support item assignment  (0) 2019.11.03