파이썬 강좌 – 정규 표현식 ~ 문자열을 검색하고 치환하기

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 - 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 - 왜 파이썬인가?
    4. 파이썬 설치 - Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 - 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 - 소통하기
    2. 변수와 대입 - 기억하기
    3. 연산자 - 계산하기
    4. 조건문 - 분기를 만들기
    5. 반복문 - 비슷한 작업을 반복하기
    6. 변수와 리스트 - 비슷한 변수들을 묶기
    7. for, range - 리스트의 항목을 다루기
    8. 파이선 기초 꿀팁
      1. 함수와 메소드의 호출 - 편리한 기능 이용하기
      2. 모듈 설치와 사용 - 유용한 기능 끌어다 쓰기
      3. 문자열 - 텍스트 다루기
  4. 파이썬 중급
    1. 정규표현식 - 문자열을 검색하고 치환하기(작성중)
    2. 함수를 직접 만들기 - 자주 쓰는 기능을 묶기
    3. 딕셔너리, 튜플, 세트 - 변수를 다양한 방법으로 묶기
    4. 클래스와 객체 - 변수를 사람으로 진화시키기
    5. 상속 - 클래스를 확장하기
    6. 파이썬 중급 꿀팁
      1. 코드를 작성하는 사람의 의도(작성중)
      2. 정체성과 동질성 - 객체의 성질(작성중)
      3. 명령문, 표현식 - 문법을 이루는 것들 (작성중)
      4. 슬라이싱 - 리스트를 갖고 놀기
  5. 파이썬 고급
    1. 예외와 에러 - 예상치 못한 상황에 대응하기
    2. 특별 메소드와 연산자 - 파이썬의 내부 작동방식 이해하기
    3. 다양한 함수 인수 - 유연한 함수 만들기
    4. 시퀀스와 반복자 - 반복과 순회를 자유자재로 다루기
    5. 변수의 범위 - 이름 검색의 범위
  6. 파이썬 심화
    1. 제너레이터와 코루틴 -
    2. async와 await
    3. 데코레이터 - 함수의 기능을 강화하기
    4. 객체로서의 클래스 - 클래스를 동적으로 정의하기
  7. 실전 (파이썬 외적인 것들)
    1. 유니코드 - 컴퓨터에서 문자를 표기하는 방법
    2. html, css, 인터넷 - 자동화 첫 걸음 내딛기
    3. 네트워크 - 인터넷으로 통신하는 방법
    4. 문서 - 문맥을 읽어보기


정규 표현식이 필요한 이유

드론 덕후인 김철수 씨는 항공안전기술원의 드론업체 현황 의 데이터를 소장하고 싶습니다. 그러나 한꺼번에 복사-붙여넣기를 시도하려고 해도 다음과 같은 텍스트로 밖에 붙여 넣어지지 않았습니다. 이를 유의미한 데이터로 갖고 싶습니다. 일일히 하나하나 복사-붙여넣기를 해야 할까요? 그렇지만 다행히도 김철수 씨는 파이썬을 사용할 줄 압니다. 어떻게든 되지 않을까요?

번호/업체명/모델명/용도/연락처/홈페이지
1/그리폰 다이나믹스/XD-1700SP, HD-2400SP/물품수송, 촬영, 국토조사, 감시정찰/053-983-1793/http://www.gryphondynamics.co.kr
2/㈜네스앤텍/SWID series, STINGRAY/촬영, 감시정찰, 경비/042-932-8086/http://www.nesnt.com
3/네온테크/ND-810, ND-820, ND-FW2H/물품수송, 감시정찰, 촬영, 국토조사/070-5090-2092/http://www.neontech.co.kr
4/두시텍/KnDrone 480S, KnDroneX/촬영, 수색/구조, 경비, 기타/042-280-1400/http://www.dusi.co.kr
5/베셀/SCANNER-MC1/물품수송, 안전진단, 경비, 수색/구조, 하천감시/031-8092-0865/http://www.vessel21.com
6/샘코/듀오드론, 폭스레이/국토조사, 촬영, 경비, 수색/구조, 기타/055-850-7787/http://www.samcokorea.com
...

단순한 텍스트의 나열에서 어떻게 유의미한 텍스트를 뽑아낼 것인가가 관건입니다. 어떻게 하면 좋을까요? 바로 정규 표현식을 이용해보는 것입니다!


정규 표현식

정규 표현식이란 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어(위키백과)이며, 줄여서 정규식이라고도 합니다. 영어로는 Regular Expression 이며, 줄여서 regex라고도 합니다. 특정한 규칙이 있는 문자열을 다루기 쉽게 해주는 편리한 도구라고 생각하시면 됩니다!

이 정규식에도 특별한 문법이 있습니다. 물론 외워야 잘 쓸 수 있겠지요? 정규식은 문자열을 다루게 되는 상황이면 거의 예외없이 사용해야 합니다. 또한 모든 프로그래밍 언어에 걸쳐서 지원하기 때문에 범용성 또한 두말 할 나위 없지요.

정규식은 프로그래밍 세계에서 아주 유명한 녀석입니다. 그만큼 설명하는 문서도 아주 많습니다. 아무래도 제가 작성하는 글들 보다는 좀 더 검증된 글들이 많으니 레퍼런스를 아래 쪽에 남겨두겠습니다.


패턴

정규식에서의 패턴은 문법이라고 생각하시면 됩니다. 우선 패턴은 설명하기 까다로우므로 일괄적으로 설명한 후에 예시를 위주로 살펴보겠습니다. 패턴은 다음과 같은 특수한 용도의 문자와, 일반적으로 찾을 문자로 구분됩니다.

  • 특수 용도 문자 : . [] * + ? {} ^ $ () |
  • 일반 문자 : abcd 등등

문자 하나를 대변하기

모든 문자

  • 사용하는 방법 : .
  • 설명 : 모든 종류의 문자 하나를 대변합니다. (단, 줄바꿈 문자는 옵션을 수정해야야 합니다.)

아무 거나 하나의 글자

  • 사용하는 방법 : [사용할 문자들]
  • 설명 :
    • 대괄호([]) 안에 있는 문자 중 아무 거나 하나의 글자를 대변합니다.
    • 하이픈(-)을 통해 범위를 지정할 수 있습니다. 예를 들어 [a-z]라면 모든 영문 소문자를 대변합니다. [a-zA-Z0-9] 처럼 여러 범위도 지정 가능합니다.
    • 대괄호가 시작할 때 ^를 넣어주면 결과가 반전이 됩니다. 예를 들어 [^abc]라면 하나의 글자는 들어가지만 a, b, c가 아닌 것들에 대해 대응됩니다.
    • 대소문자 구분 됩니다.
  • 예시
패턴 만족 불만족
b[aei]d bad, bed, bid bod, bd, bAd
hi[1-9] hi1, hi2, … , hi9 hi0, hi
b[a-z]d bad, bbd, … , bzd bd, bAd, bAad
b[A-Za-z]d bad, bbd, … , bzd, bAd, bBd, … bZd bd, bAad
b[^aei]d bbd, bEd, bzd bad, bed, bid, bd

문자가 얼마나 반복되는지 지정하기

여기서 나오는 문법들은 바로 앞의 문자나 그룹에 대해 작용합니다. 예시를 보면서 살펴봅시다.

0번 이상 반복한다

  • 사용하는 방법 : 대상문자*
  • 예시
패턴 만족 불만족
bc*d bd, bcd, bcccd bcad
oh[5-9]*s oh59786969666s, ohs oh89, oh762s

1번 이상 반복한다

  • 사용하는 방법 : 대상문자+
패턴 만족 불만족
bc+d bcd, bcccd bd, bcad
oh[5-9]+s oh59786969666s oh89, oh762s, ohs

0번 또는 1번 반복한다

  • 사용하는 방법 : 대상문자?
패턴 만족 불만족
bc?d bcd, bd bccd
oh[5-9]?s oh5s, oh8s, ohs oh89s, oh2s, 등

n번에서 m번 만큼 반복한다

  • 사용하는 방법 : 대상문자{m,n}
패턴 만족 불만족
bc{2,4}d bccd, bcccd, bccccd bcd, bcccccd
oh[5-9]{2,4}s oh586s, oh87s oh89987s, oh27s, 등

특수한 위치

시작 지점

  • 사용법: ^패턴
  • ^는 시작 지점을 뜻합니다. 즉 검사할 문자열의 가장 시작부터 탐색합니다. 예를 들어 ^.{3}는 시작 지점에서 아무 3개의 문자에 대응됩니다.

끝 지점

  • 사용법 : 패턴$
  • 설명 : $는 끝 지점을 뜻합니다. 즉 검사할 문자열의 가장 끝에서부터 탐색합니다. 예를 들어 .{3}$는 끝에서 아무 3개의 문자에 대응됩니다.

그룹

  • 사용법 : (묶을패턴)
  • 설명 : 반복 지정(*, +, ?, {})을 그룹 기준으로 하게 해줄 수도 있고, 캡처를 통해 치환 시 유용하게 쓸 수 있습니다.
  • 예시
패턴 만족 불만족
a(bc)+d abcd, abcbcd bcd, bcccccd
oh[5-9]{2,4}s oh586s, oh87s oh89987s, oh27s, 등

또는

  • 사용법 : 패턴|패턴
  • 설명 : A 또는 B를 만족시키는 패턴을 만듭니다. 그룹((패턴))내에서도 사용될 수 있습니다.
패턴 만족 불만족
aoc|abd aoc, abd aocd
o(st|m)o osto, omo oso

이메일 찾아보기


파이썬에서 정규식 이용해보기

graph TD str["정규 표현식이<br>적힌 문자열<br>(str)"] -->|"re.compile('패턴')"|pattern["패턴<br>pattern"] pattern-->|"match('대상문자열')"|matchbefore["문자열<br>처음부터<br>검사 <br>"] matchbefore --> ismatch{"일치하는<br>패턴이<br>있는가?"} pattern-->|"search('대상문자열')"|searchbefore["문자열<br>전체를<br>검사"] searchbefore --> ismatch ismatch --> |"있다"|match ismatch --> |"없다"|none["None"] pattern-->|"findall('대상문자열')"|findall["발견된 모든 문자열<br>리스트 반환"] pattern-->|"finditer('대상문자열')"|finditer["iterable 반환"] pattern-->|"sub(to, from)"|sub["from에서 to로<br>치환한 문자열<br>반환"] finditer-->iter["for 등으로<br>차례로 match에<br>접근 가능"] iter-->match match["검색 결과<br>(match)"] --> |"span()"|span["결과의 위치값<br>(시작, 끝) 튜플"] match-->|"group()"|group["결과 문자열"] match-->|"start()"|start["결과의 시작 위치<br>(인덱스)"] match-->|"end()"|en["결과의 끝 위치<br>(인덱스)"] class match,pattern em

파이썬에서 정규식을 사용하는 방법


레퍼런스

연습 문제

  1. 정규 표현식을 줄여서 무엇이라고 하는가?
  2. 정규 표현식을 영어로 하면 무엇인가?
  3. 패턴에 쓰이는 다음 특수문자가 무엇인지 설명하라 -> . [] * + ? {} ^ $ () |
  4. 다음 패턴이 무엇을 의미하는지 설명하라
    1. photo[0-9][0-9]?
    2. 01[0-9]-[0-9]{3,4}-[0-9]{4}

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

Scroll to top