이전 포스트까지 문자열(String)을 다루는 기본적인 방법에 대해 알아보았다. 텍스트 데이터의 양이 적고, 패턴이 매우 단순하다면 앞서 다룬 방법만으로도 충분하겠지만, 이를 넘어서는 텍스트 데이터를 다룰 땐 앞서 다룬 방법만으로는 데이터를 다루기가 보다 곤란하다. 이때 등장하는 것이 문자열이 갖는 특정 규칙을 이용해 패턴을 표현하는 정규 표현식이다.
1. 정규 표현식(Regular Expression)이란?
위키피디아에선 정규 표현식을 다음과 같이 설명한다 <출처: 위키백과, 정규 표현식>.
정규 표현식은 특정 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어로, 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 펄과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.
이를 이해하기 쉽게 아~~~주 간단하게 표현하면 다음과 같다.
"대상 문자열이 가지고 있는 특정 패턴을 정규 표현식이라는 이름의 패턴 문자열을 이용해서 찾아내는 방법"
당신이 "연락처"라는 데이터를 수집했다고 가정해보자, 응답자들은 단순히 연락처를 적으라고 하였으므로, 휴대전화 번호, 집전화번호, 이메일 주소와 같은 다양한 종류의 연락처를 입력하였고, 당신의 보스는 당신에게 휴대전화 번호와 집전화번호, 이메일 주소를 각각 분리해서 가지고 오라고 지시를 하였다. 애초에 이를 따로 수집했으면 이런 귀찮은 일도 안 생기겠지만, 이미 저질러진 일을 어쩌겠는가!라는 상황에서 유용하게 사용할 수 있는 것이 정규 표현식이다.
정규표현식에 대한 이해를 돕기 위해 수집한 데이터의 예시를 눈으로 보도록 하자.
data = [
"010.1234.5678", "010-1234-5678", "02-1234-5678", "031-123-4567", "042.987.6543",
"emailID01@naver.com", "emailID02@gmail.com", "Email.03@daum.net", "EM_example.01@gmail.com",
"email_1234@company.co.kr"
]
위 예제 데이터를 보면, 휴대전화 번호와 집전화번호, 이메일 주소마다 고유한 패턴을 가지고 있는 것을 볼 수 있다.
- 다음 패턴은 위 데이터만 대상으로 놓고 분류한 것이다.
- 휴대전화 번호는 010 특수 기호 '.', '-' 숫자 4자리 '.', '-' 숫자 4자리로 구성되어 있다.
- 집전화번호는 0 뒤에 1~9의 숫자가 1개에서 2개가 오고 그 뒤에 특수 기호 '.', '-' 숫자 3 ~ 4 자리, '.', '-' 숫자 4자리로 구성되어 있다.
- 이메일 주소는 ID와 Domain으로 나눠지며, 그 사이에는 '@'가 존재한다.
- ID는 영문 대, 소문자와 숫자, 특수문자 '.', '_"로 이루어져 있으며, 맨 앞에는 특수문자가 들어갈 수 없다.
- Domain은 소문자로만 이루어져 있으며, 특수문자 '.'를 기준으로 소문자가 1개에서 2개의 그룹으로 연결된다.
정규 표현식은 위 패턴을 하나의 문법으로 만들어 그 문법에 해당하는 대상을 찾거나 바꿀 수 있는 도구다. 즉, 휴대전화 번호만 찾고 싶다면 휴대전화 번호의 기본적인 패턴을 문법으로 만들고 그 문법에 해당하는 텍스트 데이터를 조회하여, 휴대전화 번호만 가지고 오게 할 수 있다.
※ 팁
한 가지 팁이라면, 데이터만 보고 정규 표현식을 사용하는 것보다. 해당 데이터의 생성 방식을 먼저 찾아보고 정규 표현식을 사용하는 것이 일반화 측면에서 더 좋다. 다음과 같은 정보는 잠깐만 인터넷 검색을 해보면 알 수 있는 정보이다.
- 휴대전화 번호의 통신망 식별번호
- 010, 011, 016, 017, 018, 019
- 지역번호
- 02, 031, 032, 033, 041, 042, 043, 044, 051, 052, 053, 054, 055, 061, 062, 063, 064
정규 표현식 문법은 각종 특수문자가 섞여 있고, 문법 작성 방식이 가독성과 거리가 꽤 멀기 때문에 지저분해 보인다는 단점이 있어, 많은 데이터 분석 입문자들이 기피하는 경향이 있다. 그러나, 텍스트 데이터를 다룰 때, 정규 표현식을 다룰 수 있고 없고의 차이는 매우 크므로, 조금 고통스럽더라도 함께 공부해보도록 하자(막상 공부해보면 보기보다 할만하다!).
2. 정규 표현식 문법과 메타 문자
- Python으로 정규 표현식을 다루는 법을 알기 전에 먼저 정규 표현식 문법부터 알아보도록 하자.
- 정규 표현식은 언어마다 문법이 조금씩 다르므로, 사용하려는 프로그램 언어에 맞는 정규 표현식 문법을 공부하는 것이 좋다.
- 정규 표현식 사용 방법은 일반적으로 다음과 같은 순으로 진행된다.
- 정규 표현식 문법 작성
- 작성된 문법을 이용한 조작(탐색, 대체 등)
2.1. 메타 문자(Meta characters)
- 평상시, 큰 의미 없이 사용했던 특수 문자들이 정규 표현식에서는 특정한 기능을 갖는데, 이를 메타 문자라고 한다.
- 정규 표현식 문법은 이 메타 문자와 찾고자 하는 Text 데이터로 구성된다.
- 이 특수 문자를 문자 그대로 사용하려면 앞에 '\'(역 슬래시)를 넣어줘야 한다.
- 역 슬래시는 한국인이 사용하는 일반적인 키보드에서 '₩'로 표기되며, '₩'는 보이기에만 이렇지 실제로는 역 슬래시로 작용하므로, 이를 그냥 사용해도 문제없다.
- 메타 문자는 크게 '문자의 패턴', '문자의 반복', '문자열의 위치', '기타 기능'으로 구성된다.
- 대표적인 메타 문자는 다음과 같다.
문자의 패턴 | 문자의 반복 | ||
[] | 문자 클래스 | + | 앞 문자 패턴이 1개 이상 |
. | 임의의 한 문자 | * | 앞 문자 패턴이 0개 이상 |
\d | 숫자 | ? | 앞 문자가 없거나 하나 있음 |
\D | 숫자가 아닌 것 | {n, m} | 앞 문자 패턴이 n개 이상 m개 이하 |
\w | 문자, 숫자, _ | {n, } | 앞 문자 패턴이 n개 이상 |
\W | 문자, 숫자, _가 아닌 것 | {n} | 앞 문자 패턴이 n개 |
\s | 공백 문자 | ||
\S | 공백 문자가 아닌 것 |
문자열의 위치 | 기타 기능 | ||
^ | 문자열의 시작 | | | 또는(or) |
$ | 문자열의 끝 | () | 문자열 패턴의 그룹화 |
이번 포스트에서는 정규 표현식이 무엇인지 알아보고, 정규 표현식에 사용되는 메타 문자가 무엇인지 알아보았다. 다음 포스트에서는 Python에서 정규 표현식의 기능을 어떻게 제공하는지 파악해보도록 하자.
'Python > Basic' 카테고리의 다른 글
Python-기초:3.2. 정규 표현식(3) - 메타 문자로 만드는 정규 표현식 패턴 (2) | 2021.12.15 |
---|---|
Python-기초:3.1. 정규 표현식(2) - Python re 모듈 (0) | 2021.12.14 |
Python-기초: 2.2. 문자열(3) - 문자열 전처리 (0) | 2021.01.20 |
Python-기초: 2.1. 문자열(2) - 문자열 포멧팅 (0) | 2021.01.20 |
Python-기초: 2.0. 문자열(1) - 문자열 생성과 이스케이프 문자 (0) | 2021.01.20 |