머신러닝에서 문자열 데이터를 다룰 때 정규 표현식을 많이 사용한다.
파이썬 정규 표현식 사용법을 알아보려고 한다.
정규 표현식은 regex라고 불리며 이는 regular expression을 줄인 것이다.
모듈은 re를 사용한다.
python 말고 그냥 정규 표현식만 가지고 테스트 하고 싶으면 아래 사이트에서 해보면 좋을 것 같다.
먼저 문법을 살펴보겠다.
특수문자
특수문자 | 설명 |
. | 단일 문자 1개와 매칭(개행 문자인 \n 제외) |
? | ?앞의 단일 문자 0개 or 1개 |
* | *앞의 문자가 0개 이상 |
+ | +앞의 문자가 1개 이상 |
^ | ^뒤의 문자열로 문자열이 시작됨 |
$ | $앞의 문자열로 문자열이 끝남 |
{num} | {}앞의 문자열이 num만큼 반복 |
{num1, num2} | {}앞의 문자열이 num1이상 num2이하 만큼 반복 (?, *, + 대체 가능) |
{num, } | num 이상 반복 |
[] | [] 안의 문자들 중 한개의 문자와 매칭, [a-z]와 같이 범위 지정 가능 [a-zA-Z]로 알파벳 전체 매칭 |
[^char] | char를 제외한 문자를 매칭 |
| | A|B와 같이 쓰이며 A or 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] 와 동일 ) |
re 모듈 함수
compile
- 정규 표현식 컴파일해줌.
- 자주 사용하는 패턴일 경우 미리 컴파일해놓고 사용하면 속도 측면에서 유리함
search
- 정규 표현식과 매치되는 패턴 검색
match
- 문자열의 처음이 정규 표현식과 매치되는지 검색
split
- 정규 표현식을 기준으로 문자열을 분리하여 리스트로 반환
findall
- 정규 표현식과 매치되는 모든 문자열 찾아서 리스트로 반환
finditer
- 매치되는 모든 문자열에 대한 이터레이터 반환
sub
- 매치되는 문자열을 다른 문자열로 대체
아래에서 할 실습은 compile()로 정규 표현식을 컴파일하고
search()로 정규 표현식이 텍스트와 매치되는지를 확인하겠다.
코드
. 기호
import re
r = re.compile("a.c") #a와 c사이 1개 문자가 있는 경우
r.search("ab") #none
r.search("abc") #<re.Match object; span=(0, 3), match='abc'>
이런 식으로 매치가 되면 객체가 반환된다.
이 후로는 편의성을 위해 객체의 match만 주석으로 작성하겠다.
? 기호
r = re.compile("a?c") #a가 0개나 1개일 경우
r.search("bc") #'c'
r.search("ac") #'ac'
r.search("abc") #'c'
* 기호
r = re.compile("ab*c") #b가 하나도 없거나, 여러 개인 경우
r.search("a") #none
r.search("ac") #'ac'
r.search("abc") #'abc'
r.search("abbbbc") #'abbbbc'
+ 기호
r = re.compile("ab+c") #b가 최소 1개 이상
r.search("ac") #none
r.search("abc") #'abc'
r.search("abbbc") #'abbbc'
^ 기호
r = re.compile("^a") #시작에 있는 a
r.search("bbc") #none
r.search("ba") #none
r.search("ab") #'a'
{숫자} 기호
r = re.compile("ab{2}c") #b를 2번 반복해야함 -> abbc만 가능
r.search("ac") #none
r.search("abc") #none
r.search("abbc") #'abbc'
{숫자 1, 숫자 2} 기호
r = re.compile("ab{2,8}c") #a와 c 사이에 b가 2~8번 반복되어야 함
r.search("ac") #none
r.search("abc") #none
r.search("abbc") #'abbc'
r.search("abbbbbbbbc") #'abbbbbbbbc'
r.search("abbbbbbbbbc") #none
{숫자, } 기호
r = re.compile("a{2,}bc") #a가 2번 이상나오고 bc가 나옴
r.search("abc") #none
r.search("aabc") #'aabc'
r.search("aaaaabc") #'aaaaabc'
[문자] 기호
r = re.compile('[abc]') #abc중 하나
r.search("dd") #none
r.search("ad") #'a'
r.search("adb") #'a'
[^문자] 기호
r = re.compile("[^abc]") #abc 제외 모든 문자
r.search("ab") #none
r.search("abcd") #'d'
여기까지 정규 표현식과 파이썬에서 정규 표현식을 사용하는 방법을 정리해봤다
다음 포스트에서는 머신러닝에서 문자열을 전처리하는 방법을 써보겠다.
'Studying > Machine Learning' 카테고리의 다른 글
[머신러닝] 학습의 Reproducibility를 위한 설정 (0) | 2022.08.09 |
---|---|
[머신러닝] 자연어 처리 파이썬 모듈 (NLP Python module) (4) | 2022.08.03 |
[머신러닝] Style transfer - 스타일 변환 (2) | 2022.07.27 |
[머신러닝] CIFAR-10 이미지 분류 - VGG-19 모델 (5) | 2022.07.25 |
[머신러닝] Local optimum이란? (0) | 2022.07.25 |
댓글