본문 바로가기

Language/Python

<파이썬 기초> 12. 정규식

이 글은 미시건 주립대학교 찰스 교수의 MOOC강의인 Python for Everybody를 수강하고 정리하며 쓰는 글입니다.

 

 

 정규식은 문자를 좀 더 다채롭게 다루게해준다. 예를 들면 마치 주민번호와 같다. 경찰이 익명의 거대한 기부자를 찾는다고 치자. 그 기부자가 99년생 남성이다. 그렇다면 주민번호를 어떻게 조회할까? 마구잡이로 할 필요가 있을까? 아닐 것이다. 99****-1****** 이런식의 번호만 찾으면 되는 것이다. 이와 같은 역할을 하는 것이 정규식이다.

 

 예시를 보기위해 앞서 사용했던 텍스트 파일을 이용하자.

 정규식을 사용하기 위해서는 가장먼저 regular expression 모듈을 import해주어야 한다.

 

import re
hand = open('practice.txt')
for line in hand :
    line = line.rstrip()
    if re.search('^My', line) :
        print(line)
        
# My name is harry.
# My tech blog's name is Harry's diary.

 

 re.search는 마치 find()메소드와 비슷하다. 그러나 위는 'My'라는 문자 시작으로하는 줄을 출력하도록 하였다. 

 정규식에서 사용가능한 문자들은 다음과 같다.

 ^ : 문장의 시작

 . : 어떤 문자 한 글자

 \S : 공백이 아닌 한 개의 문자

 \s : 공백

 * : 앞의 문자가 여러 번 반복될 수 있음 ( *? : 탐욕X )

 + : 앞의 문자가 1번 이상 (+? : 탐욕X )

 [aeiou]

 [a-z]

 [0-9]

 ( ) : 부분 추출

 

import re
x = 'My 2 favorite numbers are 3 and 77'
y = re.findall('[0-9]+',x)
print(y)
z = re.findall('[aeiou]+', x)
print(z)

# ['2', '3', '77']
# ['a', 'o', 'i', 'e', 'u', 'e', 'a', 'e', 'a']

 

 findall메소드는 모두 찾아서 리스트로 만들라는 뜻이다. y는 정수가 x에 있는 것들을 리스트로 만든 것이고, z는 aeiou가 하나라도 있는 것을 리스트로 만든 것이다.

 

 이번에는 탐욕과 비탐욕에 대해서 알아보자.

 

import re
x = 'From : Harry : harry99@kakao.com '
y = re.findall('^F.+:', x)
print(y)
z = re.findall('^F.+?:', x)
print(z)

# ['From : Harry :']
# ['From :']

 

 y와 z모두 F로 시작하고 아무문자가 여러번 반복되고 : (콜론)으로 끝나는 문자열을 x에서 찾아서 리스트로 만들라는 것이다. 그러나 y는 탐욕적인 방식으로, z는 +뒤에 ?를 붙임으로써 비탐욕적인 방식으로 진행되었다.

 

 아래는 부분추출의 예시이다.

 

import re
x = 'From harry99@kakao.com Wed Nov 010-9999-9999'
y = re.findall('^From (\S+@\S+)', x)
print(y)
z = re.findall('^From.*@([^ ]*)',x)
print(z)

# ['harry99@kakao.com']
# ['kakao.com']

 

 먼저 y를 살펴보자. ( ) 를 이용하여 부분 추출을 한것이다 From 으로 시작하고 공백아닌문자 여러개@공백아닌문자 여러개 를 x에서 추출한다. 그러면 From 뒤의 메일주소만 뽑아오게 된다.

 

 다음은 z다. z는 [^ ]를 사용하였는데, ^가 중간에 들어가면 그 뒤의 문자를 제외해달라는 것이다. 즉 ^뒤에 공백을 입력하였으므로 깔끔하게 주소만 가져올 수 있는 것이다.

 

 

 


참고 

 

 

PY4E - Python for Everybody

 

www.py4e.com

 

모두를 위한 프로그래밍 : 파이썬 강좌소개 : edwith

- 커넥트재단

www.edwith.org

 

'Language > Python' 카테고리의 다른 글

<파이썬> 2차원 배열 정렬  (1) 2021.04.01
<파이썬> 리스트 컴프리헨션  (1) 2021.03.03
<파이썬 기초> 11. 튜플  (0) 2020.10.27
<파이썬 기초> 10. 딕셔너리  (0) 2020.10.20
<파이썬 기초> 09. 리스트  (0) 2020.10.13