텍스트 처리(Text Processing)
1
2
3
4
5
s = 'AbCdEfGh'
print(s) # 원본 텍스트
print(s.lower()) # 소문자
print(s.upper()) # 대문자
1
2
3
AbCdEfGh
abcdefgh
ABCDEFGH
1
s = 'No pain no gain'
1
2
# 부분 문자열(pain)이 존재 하는지
'pain' in s
1
True
1
2
# 구분 (기본은 공백)
s.split()
1
['No', 'pain', 'no', 'gain']
1
2
# gain은 index 3에 위치
s.split().index('gain')
1
3
정규 표현식(Regular Expression)
- 특정 문자들을 편리하게 지정하고 추가, 삭제 기능
- 데이터 전처리에서 정규 표현식을 많이 사용
파이썬에서는 정규 표현식을 지원하는
re
패키지 제공- 정규 표현식 문법
특수문자 | 설명 |
---|---|
. | 앞의 문자 1개를 표현 |
? | 문자 한개를 표현하나 존재할 수도, 존재하지 않을 수도 있음(0개 또는 1개) |
* | 앞의 문자가 0개 이상 |
+ | 앞의 문자가 최소 1개 이상 |
^ | 뒤의 문자로 문자열이 시작 |
$ | 앞의 문자로 문자열이 끝남 |
{n} | n 번만큼 반복 |
{n1, n2} | n1 이상, n2 이하만큼 반복, n2를 지정하지 않으면 n1 이상만 반복 |
[abc] | 안에 문자들 중 한 개의 문자와 매치, a-z처럼 범위도 지정 가능 |
[^a] | 해당 문자를 제외하고 매치 |
a\|b | a 또는 b 를 나타냄 |
- 정규 표현식에 자주 사용하는 역슬래시(\)를 이용한 문자 규칙
문자 | 설명 |
---|---|
\\ | 역슬래시 자체를 의미 |
\d | 모든 숫자를 의미, [0-9]와 동일 |
\D | 숫자를 제외한 모든 문자를 의미, [^0-9]와 동일 |
\s | 공백을 의미, [ \t\n\r\f\v]와 동일 |
\S | 공백을 제외한 모든 문자를 의미, [^ \t\n\r\f\v]와 동일 |
\w | 문자와 숫자를 의미, [a-zA-Z0-9]와 동일 |
\W | 문자와 숫자를 제외한 다른 문자를 의미, [^a-zA-Z0-9]와 동일 |
math
- 컴파일한 정규 표현식을 이용해 문자열이 정규 표현식과 맞는지 검사
- 매칭되지 않으면 출력 결과로 None이 나타남
1
2
3
4
5
6
7
8
import re
# ab + 문자 1개
r = re.compile('ab.')
print(r.match('abc'))
print(r.match('c'))
1
2
<re.Match object; span=(0, 3), match='abc'>
None
1
2
3
4
5
6
7
# ㄱ부터 ㅎ까지에 해당하는 문자가 최소 1개 이상(+) 등장
r = re.compile('[ㄱ-ㅎ]+')
print(r.match('ㄱ'))
print(r.match(''))
print(r.match('ㅎ 안녕'))
print(r.match('안녕 ㅎ'))
1
2
3
4
<re.Match object; span=(0, 1), match='ㄱ'>
None
<re.Match object; span=(0, 1), match='ㅎ'>
None
search
- match와 다르게 search는 문자열의 전체를 검사
1
2
3
4
5
6
r = re.compile('ab?')
print(r.search('a'))
print(r.search('ab'))
print(r.search(''))
print(r.search('kkab'))
1
2
3
4
<re.Match object; span=(0, 1), match='a'>
<re.Match object; span=(0, 2), match='ab'>
None
<re.Match object; span=(2, 4), match='ab'>
1
2
3
4
5
6
7
# 한글 자음, 모음
r = re.compile('[ㄱ-ㅎ|ㅏ-ㅣ]+')
print(r.search('ㄱㅏ 안녕'))
print(r.search('ㄱㅏ'))
print(r.search('안ㄱㅏ'))
print(r.match('안ㄱㅏ'))
1
2
3
4
<re.Match object; span=(0, 2), match='ㄱㅏ'>
<re.Match object; span=(0, 2), match='ㄱㅏ'>
<re.Match object; span=(1, 3), match='ㄱㅏ'>
None
split
- 정규 표현식에 해당하는 문자열을 기준으로 문자열을 나눔
1
2
3
r = re.compile(' ')
print(r.split('abc abcc abcd'))
1
['abc', 'abcc', 'abcd']
1
2
3
r = re.compile('c')
print(r.split('abc abcc abcd'))
1
['ab', ' ab', '', ' ab', 'd']
sub
- 정규 표현식과 일치하는 부분을 다른 문자열로 교체
1
2
# a-z인 경우
print(re.sub('[a-z]', 'abcdefg', '1'))
1
1
1
2
# a-z가 아닌 경우
print(re.sub('[^a-z]', 'abc defg', '1'))
1
abc defg
1
print(re.sub('[가-힣]', '가나다라마바사', '1'))
1
1
findall
- 컴파일한 정규 표현식을 이용해 정규 표현식과 맞는 모든 문자를 리스트로로 반환
1
2
3
4
5
# 모든 숫자
r = re.compile('\d')
print(r.findall('1ab 2cd 3ef 4g'))
print(r.findall('안녕2다옹'))
1
2
['1', '2', '3', '4']
['2']
1
2
3
4
# 특수문자
r = re.compile('\W')
print(r.findall('abcd@#'))
1
['@', '#']
finditer
- 컴파일한 정규 표현식을 이용해 정규 표현식과 맞는 모든 문자를 iterator로 반환
- iterator 객체를 이용하면 생성된 객체를 하나씩 자동으로 가져올 수 있음
1
2
3
4
5
6
7
r = re.compile('[\d]')
iter1 = r.finditer('1ab 2cd 3ef 4g')
print(iter1)
for i in iter1:
print(i)
1
2
3
4
5
<callable_iterator object at 0x0000028352C03820>
<re.Match object; span=(0, 1), match='1'>
<re.Match object; span=(4, 5), match='2'>
<re.Match object; span=(8, 9), match='3'>
<re.Match object; span=(12, 13), match='4'>