. : 임의의 한 문자
^x : x로 시작하는 문자열
$x : x로 끝나는 문자열
x* : x 0번이상 반복
x+ : x 1번이상 반복
x? : x 0 또는 1개 존재
abc|123 : abc 또는 123 하나 선택
[x] : x문자 1개 일치
[^x] : x문자 제외(부정)
[a-z] : a~z 문자 1개
[A-Z] : A~Z 문자 1개
[0-9] : 0~9 숫자 1개
x{n} : x가 n번 연속
x{n,} : x가 n번 이상 연속
x{m,n} : x가 m~n번 사이 연속
\s : 공백문자
\d : 숫자 [0-9]
\D : 숫자 제외
\w : 영문자, 숫자, _ , [0-9a-zA-Z_]
\n : 줄바꿈
\t : 탭문자
import re # 정규표현식 모듈 - 방법1
from re import findall, match, sub # - 방법2
st1 = '1234 abc홍길동 ABC_555_6 이사도시'
st2 = 'test1abcABC 123mbc 45test'
st3 = 'test^홍길동 abc 대한*민국 123$tbc'
# 1) 숫자 찾기
print(findall('1234', st1, flags=0)) # ['1234']
print(findall('[0-9]', st1))
print(findall('[0-9]{3}', st1)) # ['123', '555']
print(findall('[0-9]{3,}', st1)) # ['1234', '555']
print(findall('\\d{3,}', st1)) # ['1234', '555']
['1234'] ['1', '2', '3', '4', '5', '5', '5', '6'] ['123', '555'] ['1234', '555'] ['1234', '555']
# 2) 문자열 찾기
print(findall('[가-힣]{3,}', st1))
print(findall('[a-z]{3}', st1)) # ['abc']
print(findall('[a-z|A-Z]{3}', st1)) # ['abc', 'ABC']
['홍길동', '이사도시'] ['abc'] ['abc', 'ABC']
# 단어에서 한글 이름 찾기
st_list = st1.split()
print(st_list)
names = [] # 이름 저장
for st in st_list : # 'abc홍길동'
name = findall('[가-힣]{3,}', st) # 'abc홍길동' -> ['홍길동']
if name : # 1개 이상 원소
#names.append(name) # [ ['홍길동'] ] -> 중첩list
names.append(name[0]) # ['홍길동', '이사도시']
print('names :', names) # names : ['홍길동', '이사도시']
['1234', 'abc홍길동', 'ABC_555_6', '이사도시'] names : ['홍길동', '이사도시']
# 3. 문자열 찾기
st2 = 'test1abcABC 123mbc 45test'
# 접두어/접미어
print(findall('^test', st2)) # 접두어 - ['test']
print(findall('st$', st2)) # 접미어 - ['st']
# 종료 문자 찾기 : abc, mbc
print(findall('.bc', st2)) # ['abc', 'mbc']
# 시작 문자 찾기
print(findall('t.', st2)) # ['te', 't1', 'te']
['test'] ['st'] ['abc', 'mbc'] ['te', 't1', 'te']
# 4. 단어 찾기(\\w) - 한글,영문,숫자
st3 = 'test^홍길동 abc 대한*민국 123$tbc'
words = findall('\\w{3,}', st3)
print(words) # ['test', '홍길동', 'abc', '123', 'tbc']
# 5. 문자열 제외 : x+(x가 1개 이상 반복)
print(findall('[^t]+', st3)) # ['es', '^홍길동 abc 대한*민국 123$', 'bc']
# 특수문자 제외
print(findall('[^^*$]+', st3))
['test', '홍길동', 'abc', '123', 'tbc'] ['es', '^홍길동 abc 대한*민국 123$', 'bc'] ['test', '홍길동 abc 대한', '민국 123', 'tbc']
from re import match
# (1) 패턴과 일치된 경우
jumin = '123456-3234567'
result = match('[0-9]{6}-[1-4][0-9]{6}', jumin)
print(result)
if result : # object
print('주민번호 일치') # 주민번호 일치
else : # null
print('잘못된 주민번호')
<re.Match object; span=(0, 14), match='123456-3234567'> 주민번호 일치
# (2) 패턴과 불일치된 경우
jumin = '123456-5234567'
result = match('[0-9]{6}-[1-4][0-9]{6}', jumin)
print(result)
if result : # object
print('주민번호 일치') # 주민번호 일치
else : # null
print('잘못된 주민번호')
None 잘못된 주민번호
from re import sub
st3 = 'test^홍길동 abc 대한*민국 123$tbc'
# (1) 특수문자 제거
text1 = sub('[\^*$]+', '', st3)
print(text1)
test홍길동 abc 대한민국 123tbc
# (2) 숫자 제거
text2 = sub('[0-9]', '', text1)
print(text2)
test홍길동 abc 대한민국 tbc
from re import split, match, compile
multi_line = """http://www.naver.com
http://www.daum.net
www.hongkildong.com"""
# (1) 구분자를 이용하여 문자열 분리
web_site = split("\n", multi_line)
web_site
['http://www.naver.com', 'http://www.daum.net', 'www.hongkildong.com']
# (2) 패턴 객체 만들기
pat = compile("http://")
# (3) 패턴 객체를 이용하여 정상 웹 주소 선택하기
sel_site = [site for site in web_site if match(pat, site)]
print(sel_site)
['http://www.naver.com', 'http://www.daum.net']
# 한글 텍스트 전처리
from re import findall, sub
# 텍스트
texts = [' 우리나라 대한민국, 우리나라%$ 만세', '비아그&라 500GRAM 정력 최고!', '나는 대한민국 사람', '보험료 15000원에 평생 보장 마감 임박', '나는 홍길동']
# 1. 소문자 변경
string = "ABCd"
print(string.lower()) # abcd
print(string.upper()) # ABCD
# print(texts.lower()) - list 사용 불가
# list 내포 : 변수 = [실행문 for 변수 in 열거형data]
texts_re1 = [t.lower() for t in texts]
print('texts_re1 :', texts_re1)
# 2. 숫자 제거
# list 내포 : [실행문 for 변수 in 열거형객체], 실행문(숫자 제외 -> 문자결합)
texts_re2 = [sub("[0-9]", '', text) for text in texts_re1]
print('texts_re2 :', texts_re2)
# 3. 문장부호 제거
texts_re3 = [sub('[,.?!:;]', '', text) for text in texts_re2]
print('texts_re3 :', texts_re3)
# 4. 특수문자 제거 : re.sub() 이용
spec_str = '[@#$%^&*()]'
texts_re4 = [sub(spec_str, '', text) for text in texts_re3]
print('texts_re4 :', texts_re4)
# 5. 영문 제거
texts_re5 = [''.join(findall("[^a-z]", text)) for text in texts_re4]
print('texts_re5 :', texts_re5)
# 6. 공백제거 제거 : 'abtta a' -> 'abtta', 'a' -> 'abttaa'
texts_re6 = [' '.join(text.split()) for text in texts_re5] # 공백기준 split -> join
print('texts_re6 :', texts_re6)
abcd ABCD texts_re1 : [' 우리나라 대한민국, 우리나라%$ 만세', '비아그&라 500gram 정력 최고!', '나는 대한민국 사람', '보험료 15000원에 평생 보장 마감 임박', '나는 홍길동'] texts_re2 : [' 우리나라 대한민국, 우리나라%$ 만세', '비아그&라 gram 정력 최고!', '나는 대한민국 사람', '보험료 원에 평생 보장 마감 임박', '나는 홍길동'] texts_re3 : [' 우리나라 대한민국 우리나라%$ 만세', '비아그&라 gram 정력 최고', '나는 대한민국 사람', '보험료 원에 평생 보장 마감 임박', '나는 홍길동'] texts_re4 : [' 우리나라 대한민국 우리나라 만세', '비아그라 gram 정력 최고', '나는 대한민국 사람', '보험료 원에 평생 보장 마감 임박', '나는 홍길동'] texts_re5 : [' 우리나라 대한민국 우리나라 만세', '비아그라 정력 최고', '나는 대한민국 사람', '보험료 원에 평생 보장 마감 임박', '나는 홍길동'] texts_re6 : ['우리나라 대한민국 우리나라 만세', '비아그라 정력 최고', '나는 대한민국 사람', '보험료 원에 평생 보장 마감 임박', '나는 홍길동']
from re import findall, sub
# 텍스트 전처리2
texts = [' 우리나라 대한민국, 우리나라%$ 만세', '비아그&라 500GRAM 정력 최고!', '나는 대한민국 사람', '보험료 15000원에 평생 보장 마감 임박', '나는 홍길동']
# 텍스트 전처리 함수
def crean_text(text) : # 문자열 인수
# 1~6단계
texts_re = text.lower() # 소문자 변경
texts_re2 = sub('[0-9]', '', texts_re) # 숫자 제거
texts_re3 = sub('[,.?!;:]', '', texts_re2) # 문장부호 제거
texts_re4 = sub('[@#$%^&*()]', '', texts_re3) # 특수문자 제거
texts_re5 = sub('[a-z]', '', texts_re4) # 영문자 제거
texts_re6 = ' '.join(texts_re5.split()) # white space 제거(단어 구분)
return texts_re6 # 반환값
# 함수 호출
texts_result = crean_text(texts[1]) # 한 문장 처리
print(texts_result) # 우리나라 대한민국 우리나라 만세
texts_result = [crean_text(text) for text in texts]
print(texts_result)
비아그라 정력 최고 ['우리나라 대한민국 우리나라 만세', '비아그라 정력 최고', '나는 대한민국 사람', '보험료 원에 평생 보장 마감 임박', '나는 홍길동']
# 레이블(label) 분류
label = ['spam', 'ham', 'spam', 'ham', 'ham']
target = [ 1 if x == 'spam' else 0 for x in label] # dummy 변수
print('target : ', target)
# target : [1, 0, 1, 0, 0]
target : [1, 0, 1, 0, 0]