공돌하우스

[정규표현식] Python RegEx 본문

PYTHON

[정규표현식] Python RegEx

빅톨 :) 2021. 5. 16. 18:15

안녕하세요! 빅톨입니다 :)

업무처리를 하거나 코딩을 하다보면 글에서 폰번호와 같은 특정 정보를 반복적으로 추출해야하는 경우가 많이 발생합니다. 오늘은 이런 경우 유용하게 사용할 수 있는 정규표현식에 대해 알아보겠습니다. 본 글은 RegEx Cheat Sheet - Python을 기반으로 작성되었습니다.

 


 

정규표헌식이란?

정규표현식은 텍스트에서 특정 정보를 쉽게 찾을 수 있도록 만들어진 문자열 탐색 방법입니다. 정규표현식에서 정해진 규칙에 따락 작성된 패턴문구를 입력하면, 해당 패턴에 매칭되는 정보들을 텍스트에서 추출해줍니다. 따라서 패턴을 한번만 작성하면 반복 노가다에서 벗어날 수 있다는 장점이 있습니다. 또한 Python, JavaScript, PHP, Java 등과 같은 프로그래밍 언어 뿐만 아니라 구글 스프레드시트(구글이 만든 엑셀)에서도 지원하므로 다양한 상황에 적용시킬 수 있습니다. 오늘은 그 중 파이썬에서 정규표현식을 활용하는 방법을 알아보겠습니다.

 

고객정보가 저장된 log.txt라는 파일이 다음과 같이 작성되어 있고, 저희는 여기서 고객의 휴대폰 번호들을 추출해야하는 상황이라고 가정해보겠습니다.

1. Ema Dough (+1-202-555-0189) - 915 Ridge Street Corpus, TX 78418
2. Tom Hitt (+33-93-751-3845) - 9190 Berkshire Ave. Wayne, NJ 07470
3. Maya Raine (+49-30-833-931-313) - 18 SW. Sage Ave. Ride, CA 95993

휴대폰 번호를 잘 보시면 괄호안에 있고 숫자가 "-"로 이어진 문자열이라는 공통점이 있습니다. 따라서 파이썬 코드를 아래와 같이 작성하면 고객들의 휴대폰 번호를 추출할 수 있습니다.

import re
phone_numbers = [] 
pattern = r"\(([\d\-+]+)\)"

with open("log.txt", "r") as file:
    for line in file: 
        result = re.search(pattern, line)
        phone_numbers.append(result.group(1))

print(phone_numbers)

출력물: ['+1-202-555-0189', '+33-93-751-3845', '+49-30-833-931-313']

 

위 코드를 설명하자면 다음과 같습니다.

  1. import re --- 파이썬 정규표현식 라이브러리인 re를 import 합니다.
  2. phone_numbers = [] --- 추출된 폰번호를 저장할 빈 리스트를 생성합니다.
  3. pattern = r"\(([\d\-+]+)" --- 폰번호를 추출하기 위한 패턴문구를 저장합니다.
  4. with open("log.txt", "r") as file: --- 저희가 처리하고자 하는 파일을 불러옵니다.
  5. for line in file: --- log.txt의 각 줄에 대해 반복적으로 코드를 실행합니다.
  6. result = re.search(pattern, line) --- 각 줄에서 패턴문구에 해당하는 휴대폰 번호를 탐색합니다.
  7. phone_numbers.append(result.group(1)) --- 처음에 생성한 리스트에 추출된 폰번호를 저장합니다.
  8. print(phone_numbers) --- 최종 폰번호 리스트를 출력합니다.

 

파이썬에서 정규표현식을 사용할때는 대략 위의 과정으로 코드가 작성됩니다. 이때 중요한 것이 바로 3번 패턴문구 작성 과정인데요. 이 패턴문구를 작성하기 위해서는 정규표현식의 기본적인 문법을 공부하고, 자주 사용되는 패턴을 알아두시면 도움이 됩니다. 이에 대해서는 잘 정리된 블로그 글들이 많으므로 참고하시면 될 것 같습니다.

 

자주 쓰이는 정규식(Regular Expression)

전자우편 주소: /^[a-z0-9_+.-]+@([a-z0-9-]+\.)+[a-z0-9]{2,4}$/ URL: /^(file|gopher|news|nntp|telnet|https?|ftps?|sftp):\/\/([a-z0-9-]+\.)+[a-z0-9]{2,4}.*$/ HTML 태그 - HTML tags: /\<(/?[^\>]+)\>/ 전..

gocoding.tistory.com

 

정규표현식 (Regex) 정리

정규표현식은 아주 가끔 쓰기때문에 항상 다시 볼때마다 헥깔리곤 하는데.. 주요 사용예를 정리하여 보았다. 나중에 찾아보기 편하라고~ 정규 표현식의 용어들 정규 표현식에서 사용되는 기호

hamait.tistory.com

 

다음으로 알아두셔야 할 것이 6번에서 사용된 search()와 같은 RegEx의 function들 입니다.

findall() --- 매칭되는 모든 요소를 포함한 리스트를 반환

search() --- 매칭되는 요소가 있다면 해당하는 하나의 문자열을 반환

split() --- 매칭되는 요소를 기준으로 분활된 문자열 리스트를 반환

sub() --- 매칭되는 요소를 특정 문자열로 교체

 

아래는 사용예제입니다.

1. findall()

import re

pattern = r".at"
line = "The big fat cat sat on a cat"
result = re.findall(pattern, line)

print(result)

출력물: ['fat', 'cat', 'sat', 'cat']

2. search()

import re

pattern = r".* .*"
line = "Ada Lovelace"
result = re.search(pattern, line)

print(result)
출력물: <_sre.SRE_Match object; span=(0, 12), match='Ada Lovelace'>

print(result.group())
출력물: Ada Lovelace

print(result.group(0))
출력물: Ada Lovelace

3. split()

import re

pattern = r"cat"
line = "The big fat cat sat on a cat"
result = re.split(pattern, line)

print(result)
출력물: ['The big fat ', ' sat on a ', '']

4. sub()

import re

pattern = r"Ada"
line = "Ada Lovelace"
result = re.sub(pattern, r"Tom", line)

print(result)
출력물: Tom Lovelace

 

다음으로 7번에서 사용된 group 기능에 대해 알아야합니다. 이 그룹기능은 매칭되는 문자열 중에서 저희가 원하는 문구만 추출할 수 있는 기능입니다. 아래와 같이 사용할 수 있습니다.

 

1. search()

import re

pattern = r"(.*) (.*)"
line = "Ada Lovelace"
result = re.search(pattern, line)

print(result)
출력물: <_sre.SRE_Match object; span=(0, 12), match='Ada Lovelace'>

print(result.groups())
출력물: ('Ada', 'Lovelace')

print(result.group(0))
출력물: Ada Lovelace

print(result.group(1))
출력물: Ada

print(result.group(2))
출력물: Lovelace

2. split()

import re

pattern = r"(cat)"
line = "The big fat cat sat on a cat"
result = re.split(pattern, line)

print(result)
출력물: ['The big fat ', 'cat', ' sat on a ', 'cat', '']

3. sub()

“\1” 와 “\2”는 각각 첫번째, 두번째 그룹을 의미합니다.

import re

pattern = r"(.*) (.*)"
line = "Ada Lovelace"
result1 = re.sub(pattern, r"\2 \1", line)
result2 = re.sub(pattern, r"Tom", line)

print(result1)
출력물: Lovelace Ada

print(result2)
출력물: Tom

 


 

오늘은 파이썬에서 정규표현식을 활용하는 방법에 대해 알아봤습니다. 다음 시간에는 코딩을 모르는 분들도 사용할 수 있는 구글 스프레드시트에서 정규표현식을 사용하는 법을 포스팅하겠습니다.

감사합니다~