본문 바로가기
하얀눈으로 IT

비정형 데이터 분석 - 정규 표현식을 이용한 문자 추출

by whit2eyes 2022. 9. 28.

다들 한번쯤을 들어 보셨을 것 같은데요, 정규 표현식(Regular Expression)에 대한 이야기를 하고자 합니다. 정규 표현식은 특정한 규칙을 가지고 있는 문자열들을 표현하는데 사용되는 규칙을 가진 언어로 메타문자(Meta Character)라고 합니다. 문자열의 시작, 끝, 문자, 숫제 등 특정 규칙 혹은 패턴에 맞는지를 검사할 수 있는 것인데요, 그 예로 주어진 문서상에 특정 문자가 있는지, 반복패턴이 있는지, 인터넷상의 로그인 패스워드 규칙을 확인하는 것 등이 있습니다. 

표현식 기능 설명
^ 시작 문자열의 시작을 의미. ^A A로 시작
$ 문자열의 끝을 으미
. 문자 한 개의 문자
\d 숫자 한 개의 숫자
\w 문자와 숫자 한 개의 문자나 숫자
\s 공백문자 공백 문자(스페이스, 탭, 줄바꿈 등)
\S 공백제외 문자 공백 문자를 제외한 모든 문자
* 반복 앞 문자가 0번 이상 반복
+ 반복 앞 문자가 1번 이상 반복
? 반복 앞 문자열 임의의 패턴을 0번 또는 1번 이상 반복
[abc] 문자 선택 범위 a, b, c 가운데 하나의 문자
[^abc] 문제 제외 범위 a, b, c 가 아닌 어떤 문자
| 또는 | 앞의 문자 또는 뒤의 문자

+의 경우는 1번 이상 반복되어야 하기 때문에 아래와 같은 경우는  조건에 맞지 않게 됩니다. 

re.search('AB+', 'A')  # 맞지 않음

re.search('AB+', 'AA') #맞지 않음

re.search('AB+', 'CABBA')  #조건에 맞음 ABB

 

파이썬에서 정규식을 사용하려면 're' 모듈을 import 해야 합니다. 

import re

txt1 = 'Life is too short, you need python.'
txt2 = 'The best moments of my life.'

#문장 안에 Life가 있는지 검사
print(re.search('Life', txt1))

match = re.search('Life', txt1)

match.start()    # 0
match.end()   # 4
match.span()  # (0, 4)
txt1[0:4]  #'Life'

print(re.search('Life|life', txt2)) # 문장 안에 Life 또는 life가 있는지 검사
print(re.search('[Ll]ife', txt2)) # 문장 안에 Life 또는 life가 있는지 검사
print(re.search('^Life', txt1)) # 제일 첫단어로 Life가 있는지 검사

 

findall() 함수는 정규식을 만족하는 모든 문자열을 추출 합니다. 

txt3 = 'My life my life my life in sunshine'
re.findall('[Mm]y', txt3)

#결과
['My', 'my', 'my']

sub() 함수는 특정 문자를 대체합니다. 

import re
s = 'I like BTS!'
re.sub('BTS', 'Black Pink', s)

 

 

다음과 같은 문제를 통하여 실습해보세요!!

문제1) 다음과 같은 수강 교과목 코드와 약칭으로 된 문자열이 있을때, 수강 번호만 리스트 형식으로 추출하라

101 COM PythonProgrammng

102 MAT LinearAlgebra

103 ENG ComputerEnglish

 

결과

['101', '102', '103']

 

문제2) 아래 텍스트에서 이메일 주소만 추출하라

txt = 'abc@facebook.com와 bbc@google.com에서 이메일이 도착하였습니다. '

 

결과

추출된 이메일 : ['abc@facebook.com', 'bbc@google.com']

 

문제3) 패스워드 검사 프로그램 만들기

조건1 : 최소 8글자

조건2 : 적어도 하나의 영문자 대문자 및 소문자를 포함

조건3 : 적어도 하나의 숫자 포함

조건4 : 특수문자[_, @, $, !] 중 하나 포함

 

import re

# 패스워드 체크 함수 정의
def passwordCheck(pwd):
  if len(pwd) < 8 or len(pwd) > 21:
    print('비밀번호는 8자이상 20자 이하여야 합니다.')
    return False
  elif not re.findall('[0-9]+', pwd):
    print('숫자를 포함하여야 합니다.')
    return False
  elif not re.findall('[a-z]', pwd) or not re.findall('[A-Z]', pwd):
    print('소문자 및 대문자를 포함하여야 합니다.')
    return False
  elif not re.findall('[`~!@#$%^&*(),<.>/?]+', pwd):
    print('비밀번호는 최소 1개 이상의 특수문자가 포함되어야 합니다.')
    return False
  
  print('정상입니다.!!!')
  return True

# 패스워드 입력 및 회수 카운트
cnt = 0
while True:
  pwd = input("패스워드를 입력하세요 :")
  result = passwordCheck(pwd)
  
  if cnt < 6:
    if result == False:
      cnt += 1
      if cnt == 5:
         print('패스워드 입력회수를 초과하였습니다.')
         break
      else:
        print('다시 입력하세요!!')
    else:
      print('잘입력하셨습니다.')
      break
print('종료합니다.')

 

 

 

하나씩 잘 정리해 보아야 겠습니다. 오늘하루도 즐거운 하루 되십니다. 

본 내용은 구자환 교수님 강의를 기반으로 하였습니다. 

 

공감과 구독은 제게 많은 힘이 될 듯 합니다. !!!

댓글