본문 바로가기
국비 교육/데이터

[데이터 수집] 정규 표현식(Regular Expression) -1

by 육츠 2023. 10. 31.
Contents 접기

정규표현식: 복잡한 문자열을 처리할때 사용하는 기법

# 정규표현식: 비사용 방식

data = """
park 800904-1234567
kim 841204-1034562
"""

result = []
for line in data.split('\n'):
    word_result = []
    for word in line.split():
        if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit():
        # isdigit() # 숫자 여부 체크
            word = word[:6] + '-' + '*******'
        word_result.append(word)
    result.append(''.join(word_result)) # 이름, 주민번호를 다시 공백으로 묶음
print('\n'.join(result))

> 정규 표현식을 사용하기 전
개행문자를 기준으로 문자열을 끊어주고 -> 공백 기준으로 글자를 다시 끊어준 후 ->글자 개수가 14개인지, 앞에 6글자와 뒤에 7글자가 숫자인지 검사 -> 뒷자리 7글자를 '*' 문자로 변경 후 ' '.join()을 통해 다시 묶는다.

# 정규 표현식: 사용 방식
import re

data = """
park 800904-1234567
kim 841204-1034562
"""
pat = re.compile('(\d{6})[-]\d{7}')
print(pat.sub(r'\1-*******',data).strip())
# park 800904-*******
# kim 841204-*******

# 그룹핑 활용

 

정규표현식 사용 : import re(Regular Expressiond의 줄임말) 올린 후 -> 해당하는 패턴을 re.compile() 함수를 이용해 만들어주고 -> 변수이름.sub(바꿀 문자열, 대상 문자열,바꿀횟수)를 통해 뒤에 그룹 2번을 변경한다.

메타문자: 정규 표현식에 사용되어 지는 특별한 의미를 갖는 문자

1. [] : 문자들 중 하나와 매치되는지(1개라도 매치가 되면 됨)
- 문자 클래스 안에 ^ 메타문자 사용은 not의 의미
- 문자 클래스 밖에 사용은 특정 문자로 시작하는지 판단

[abc] 'a' / 'before' / 'dude' Yes/ Yes/ No

2. 자주 사용하는 문자클래스
- \ : 문자 그대로 표현하려면 앞에 붙임 (예: \*)
- \d: = 숫자와 매치 [0-9] <-> \D = 숫자가 아닌 것과 매치
- \s: = 공백문자와 매치 [ \t \n \r \f \v ] <-> \S = 공백문자가 아닌 것과 매치
- \w: = 문자+숫자와 매치[0-9a-zA-Z] <-> \W = 문자+숫자가 아닌 것과 매치

3. Dot(.)
줄바꿈 문자인 \n 을 제외하고 모든 문자와 매치
[ . ] 을 사용하면 문자 원래 의미인 마침표가 됨

a.b aab / a0b / abc Yes / Yes/ No

4.  반복(*)
* 바로 앞에 문자가 0부터 무한대로 반복
5.반복(+)
+는 최소 1번 이상 반복될 때 사용

6. 반복횟수 지정{m,n}
{m,n} m부터 n까지 매치 가능하다. {m,} : m 이상/ {,n}: n이하/ {n} n번 반복

7. ? 
? 앞에 문자가 하나 있거나 없을때 매치

8. $
$ 앞에 있는 문자로 끝나면 매치

print(re.search('short$','Life is too short'))
print(re.search('short$','Life is too short,you need python'))

# <re.Match object; span=(12, 17), match='short'>
# None

9. ^
^ 다음에 있는 문자로 시작하면 매치

10. |
or의 의미로 사용

import re
p = re.compile('Crow|Servo')
m = p.match('ServoHello')
print(m)

# <re.Match object; span=(0, 5), match='Servo'>