지금까지 문자열(string) type을 생성하고 이스케이프 문자, 포맷팅에 대해 학습해보았다. 지금까지 학습한 내용은 문자열을 생성하는 것에 관련 있는 것이지, 문자열을 다루는 내용과는 거리가 멀다고 할 수 있다.
이번 포스트에서는 문자열을 직접 가지고 노는 문자열 전처리 코드에 대해 학습을 해보겠다.
문자열 전처리
1. 문자열 연산
문자열 연산은 우리가 일반적으로 아는 더하기, 빼기, 곱하기와 같은 기능으로, 앞서 학습했던 List에서의 더하기, 곱하기처럼 문자A + 문자B는 문자A문자B가 되며, 문자 A * 3은 문자A문자A문자A가 된다.
# 1. 문자열을 더해보자
>>> A = "Python"
>>> B = "is"
>>> C = "easy"
>>> D = "and"
>>> E = "useful"
>>> F = A + " " + B + " " + C + " " + D + " " + E
>>> print(F)
Python is easy and useful
# 2. 문자열을 곱해보자
>>> A * 2
'PythonPython'
# 3. 문자열을 더하고 곱해보자
>>> G = A + " "
>>> print(G * 3)
Python Python Python
- 문자열 더하기는 꽤 유용하게 사용할 수 있는 기능으로, 포맷팅과 동일하게 사용할 수도 있다.
# 문자열 더하기를 포맷팅처럼 사용해보자
>>> AB = A + " " + B + " "
>>> print(AB + C)
>>> print(AB + E)
Python is easy
Python is useful
위와 같은 산술 연산 기호를 사용하는 것은 아니지만 문자열 빼기도 가능하다
# 생성된 문자열 F에서 and를 제거해보자
>>> print(F)
Python is easy and useful
>>> F.replace("and ", "")
'Python is easy useful'
# 문자열 F에서 and를 or로 바꿔보자
>>> F.replace("and", "or")
'Python is easy or useful'
- 문자열 빼기가 문자열 F에서 문자열 D를 제거하는 것이라면, replace 함수를 응용해서 사용할 수 있다.
- replace(): 문자열.replace(대상 문자, 바꿀 문자) 함수를 사용하면, 대상 문자를 내가 원하는 다른 문자로 바꿀 수 있다.
2. 문자열 인덱싱(슬라이싱)
문자열 인덱싱은 문자에서 내가 원하는 구간의 문자만 선택하는 방법이다.
# 위에서 생성했던 문자열 F를 가지고 indexing을 해보자
>>> print(F)
'Python is easy and useful'
# 1. 먼저 문자 전체의 길이를 확인해보자
>>> len(F)
25
# 2. 문자열 F에서 첫 문자부터 5번째 문자까지 가지고 와보자
>>> F[0:5]
'Pytho'
# 2.1. 문자열 F를 뒤에서 6번째부터 뒤 모든 문자를 가지고 와보자
>>> F[-6:len(F)]
'useful'
>>> F[-6:]
'useful'
- len(x): len 함수는 들어간 문자의 길이를 반환한다. x에 list나 DataFrame 등이 들어가는 경우, list는 원소의 수, DataFrame은 Row의 수를 반환한다.
- 인덱싱에서 [n1:n2] n1에 아무것도 넣지 않는 경우 처음부터인 0을 의미한다. n2에 아무것도 넣지 않는 경우 마지막 위치를 의미한다.
- 인덱싱한 값을 다른 변수에 담으면, 슬라이싱(부분만 가져오기)이 된다.
# 슬라이싱 기능을 활용하면 원하는 위치만 제거 혹은 다른 문자 끼워넣기가 가능하다.
>>> print(F)
'Python is easy and useful'
# 1. "easy and "를 제거해보자
>>> F[:10] + F[-6:]
'Python is useful'
# 2. useful을 useless로 바꿔보자
>>> F[:10] + F[-6:-3] + "less"
'Python is useless'
위 인덱싱에선 내가 찾고자 하는 문자의 위치를 직접 확인해야 했으나, 문자 위치를 반환하는 함수인 find(), index() 함수를 사용하면, 위치를 수월하게 찾을 수 있다.
# 문자열 F에서 and의 위치를 찾아보자
>>> print(F)
'Python is easy and useful'
>>> F.find("and")
15
>>> F[15:]
'and useful' # 단어의 시작 위치가 출력된다.
# index() 함수는 find() 함수와 동일한 기능을 한다.
>>> target_start = F.index("and")
>>> print(target_start)
15
# len() 함수를 섞어서 사용하면 이 문제를 해결할 수 있다.
>>> F[target_start:target_start+len("and")] # 문자 끝 위치 = 문자 시작 위치 + 문자 길이
'and'
- 문자열.find(탐색 문자), 문자열.index(탐색 문자) 함수를 사용하면, 해당 문자가 처음 등장한 문자의 위치를 알 수 있다.
- len() 함수와 섞어서 사용한다면 문자의 끝 위치도 알 수 있다.
- 그러나 만약, 해당하는 문자가 여러개라면 가장 왼쪽에서 등장한 문자의 위치만 반환한다는 단점이 있다(이는 추후 학습할 정규표현식 함수를 사용하면 수월하게 해결할 수 있다).
- index() 함수와 find() 함수의 차이는 대상 단어가 없을 때로, find() 함수 사용 시 대상 단어가 없으면 -1이 반환되고, index() 함수는 에러가 발생한다.
3. list와 str
str type과 list type을 오가게 하는 함수가 있으며, 이를 단순히 말하면 아래와 같다.
- "구분자".join(대상 문자열): 합치기
- "대상 문자열".split("구분자"): 쪼개기
>>> target = "Python is fun and useful"
# 1. 문자열을 list로 쪼개보자
>>> target_list = target.split(" ")
>>> print(target_list)
['Python', 'is', 'fun', 'and', 'useful']
# 2. list를 문자열로 합쳐보자
# _(Under bar)로 합쳐보자
>>> target_str = "_".join(target_list)
>>> print(target_str)
Python_is_fun_and_useful
# 3. 생성된 단어를 한 글자 단위로 잘라보자
# join() 함수를 문자열을 대상으로 사용하면, 문자열에서 단어 하나하나 사이에 특정 단어가 들어간다.
>>> put_separator = "|".join(target_str)
>>> print(put_separator.split("|"))
['P', 'y', 't', 'h', 'o', 'n', '_', 'i', 's', '_', 'f', 'u', 'n', '_', 'a', 'n', 'd', '_', 'u', 's', 'e', 'f', 'u', 'l']
- join() 함수를 문자열을 대상으로 사용 시, 문자열의 단어 하나하나 사이에 join 단어가 들어간다.
- |는 거의 사용하지 않는 특수 문자 중 하나로 일반적으로 Rawdata에 존재하지 않는다.
- join() 함수와 split() 함수를 섞어서 사용하면 한 단어 단위로 자를 수 있다.
4. 공백 제거하기
# Target
>>> target = " Python is easy and useful "
# 1. 앞의 공백을 제거하자
>>> target.lstrip()
'Python is easy and useful '
# 2. 뒤의 공백을 제거하자
>>> target.rstrip()
' Python is easy and useful'
# 3. 양쪽 공백을 제거하자
>>> target.strip()
'Python is easy and useful'
# 4. 모든 공백을 제거하자
>>> target.replace(" ", "")
'Pythoniseasyanduseful'
- 문자열.lstrip(): 왼쪽 공백 제거
- 문자열.rstrip(): 오른쪽 공백 제거
- 문자열.strip(): 양쪽 공백 제거
- 문자열.replace(" ", ""): 모든 공백 제거
5. 대소문자 바꾸기
# Target
>>> target = "Python is easy and useful"
# 1. 소문자를 대문자로 바꿔보자
>>> upper_T = target.upper()
>>> print(upper_T)
PYTHON IS EASY AND USEFUL
# 2. 대문자를 소문자로 바꿔보자
>>> upper_T.lower()
'Python is easy and useful'
- 문자열.upper(): 소문자를 대문자로 만든다
- 문자열.lower(): 대문자를 소문자로 만든다
6. 문자열 개수 세기
# target
>>> target = "Python is fun and useful"
# 1. 문자열 전체 길이를 확인해보자
>>> len(target)
25
# 2. 문자열 안에 특정 문자가 몇 개 있는지 확인해보자
>>> target.count(" ")
4
>>> target.count("Python")
1
지금까지 문자열을 다루는 기본적인 함수에 대해 알아보았다. 위 함수들을 보면, 내가 원하는 단어를 탐색하고 조작하는 부분이 실전에서 필요한 것에 비해 부족하다는 것이 느껴지는데, 이를 보다 체계적으로 할 수 있는 방법이 바로 정규표현식이다.
다음 포스트에서는 파이썬 정규표현식에 대해 학습해보도록 하겠다.
'Python > Basic' 카테고리의 다른 글
Python-기초:3.1. 정규 표현식(2) - Python re 모듈 (0) | 2021.12.14 |
---|---|
Python-기초:3.0. 정규 표현식(1) - 소개: 정규 표현식과 메타 문자 (0) | 2021.12.14 |
Python-기초: 2.1. 문자열(2) - 문자열 포멧팅 (0) | 2021.01.20 |
Python-기초: 2.0. 문자열(1) - 문자열 생성과 이스케이프 문자 (0) | 2021.01.20 |
Python-기초: 1.5. 자료형(6) - DataFrame (0) | 2021.01.15 |