Py) TM - 정규표현식-01(개요)

Py) TM - 정규표현식-01(개요)

텍스트마이닝을 하기 위한 전처리 과정 중 하나인 정규표현식에 대해 알아본다. 정규표현식은 텍스트 데이터를 다루는데 있어 매우 유용한 도구이다. 여기서는 Pandas 객체 기반 정규표현식을 활용한 텍스트 처리의 개념과 관련 메서드를 알아본다.


본 게시물을 온전히 이해하기 위해서는 결측치 처리 기초 게시물 “Py) 기초 - Pandas(문자 데이터)”를 먼저 충분히 숙지하는 것을 추천한다.

개요

정규표현식(Regular Expression)은 특정한 규칙을 가진 문자열의 패턴을 검색, 매칭, 추출, 치환하는 데 사용할 수 있는 문법이다. Pandas.str 접근자(accessor)의 정규표현식을 활용하여 대규모 텍스트 데이터를 효율적으로 처리할 수 있는 다양한 메서드를 제공합니다.

활용

정규표현식을 활용할 경우 크게 다섯 가지 방식으로 활용할 수 있다고 볼 수 있으며 그 목록은 다음과 같다.

  • 데이터 클리닝(Data Cleaning): 불필요한 문자 제거, 특수문자 치환, 공백 정리
  • 데이터 추출(Data Extraction): 로그 파일에서 에러 메시지 추출, 텍스트 데이터에서 날짜 정보 추출
  • 데이터 변환(Data Transformation): 특정 형식의 날짜를 다른 형식으로 변환, 텍스트 내 단어 치환
  • 데이터 검증(Data Validation): 이메일 형식, 전화번호 형식, 신용카드 번호 형식 검증
  • 텍스트 분석(Text Analysis): 단어 빈도수 계산, 특정 패턴의 출현 빈도 분석 등

관련 메서드

Pandas Series 객체의 .str 접근자에 있는 메서드 중 정규표현식을 지원하는 메서드의 목록과 설명은 다음과 같다.

메서드명 설명
.str.contains 특정 패턴이 문자열에 포함되어 있는지 여부를 논리값 Series로 반환
.str.replace 패턴에 매칭되는 부분을 지정된 문자열로 치환
.str.extract 패턴에 매칭되는 부분을 추출하여 새로운 DataFrame으로 반환
.str.extractall 패턴에 매칭되는 모든 부분을 추출하여 MultiIndex로 반환
.str.findall 패턴에 매칭되는 모든 부분을 리스트로 반환
.str.match 문자열 전체가 패턴과 일치하는지 여부를 논리값 Series로 반환
.str.split 패턴을 기준으로 문자열을 분할

상기 목록 중 .str.replace().str.split()의 경우 정규표현식을 사용하여 운용하려면 “regex” 인자에 True 를 할당해야 하니 사용 전 확인이 필요하다.

핵심 정규표현식

정규표현식은 특수기호와 문법이 여러 종류가 있지만 그 중 특히 많이 사용되는 것에 대해 알아본다.

정규표현식 예시 설명
^ ^a ~로 시작하는(a로 시작하는)
$ a$ ~로 끝나는(a로 끝나는)
| a|b 또는(a 또는 b)
. a. 임의의 단일 문자(a 뒤에 임의의 단일 문자)
[] [a-z] 문자 클래스(a부터 z까지 문자 중 하나. 즉, 영문 소문자)
[^] [^a-z] 부정 문자 클래스(a부터 z까지의 문자가 아닌 한 글자. 영문 소문자 제외)

부정문자 클래스에서 ^ 기호는 문자 클래스 내에서 사용할 경우 부정을 의미하지만 문자 클래스 밖에서 사용할 경우 문자열의 시작을 의미하기 때문에 초심자는 이 부분에서 헷갈릴 수 있으니 주의가 필요하다.

실습

간단하게 정규표현식을 지원하는 메서드와 정규표현식의 활용에 대해 알아보기 위해 다음과 같이 라이브러리와 데이터를 준비한다.

1
2
3
4
5
6
7
8
import pandas as pd

ser = pd.Series(["aaa", "abc", "ccc"])
ser
## 0 aaa
## 1 abc
## 2 ccc
## dtype: object

위 데이터를 활용하여 다음과 같은 실습을 진행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ser.str.replace("a", "🛫") # 1
## 0 🛫🛫🛫
## 1 🛫bc
## 2 ccc
## dtype: object

ser.str.replace("^a", "🛫") # 2
## 0 aaa
## 1 abc
## 2 ccc
## dtype: object

ser.str.replace("^a", "🛫", regex = True) # 3
## 0 🛫aa
## 1 🛫bc
## 2 ccc
## dtype: object

위 코드에서 1번 코드는 문자열 “a”를 “🛫”로 치환한 결과를 보여주며 2번은 문자열 “a”로 시작하는 문자열을 “🛫”로 치환한 결과를 기대했지만 .str.replace() 메서드는 기본적으로 정규표현식을 사용하지 않기 때문에 “^a” 라는 문자열이 없어 아무것도 치환되지 않은 것을 볼 수 있다. 3번 코드는 정규표현식을 사용하기 위해 “regex”인자에 True를 할당하였고 그 결과 “a”로 시작하는 패턴이 “🛫”로 치환된 것을 볼 수 있다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×