텍스트마이닝을 하기 위한 전처리 과정 중 하나인 정규표현식에 대해 알아본다. 정규표현식은 텍스트 데이터를 다루는데 있어 매우 유용한 도구이다. 여기서는 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 | import pandas as pd |
위 데이터를 활용하여 다음과 같은 실습을 진행한다.
1 | ser.str.replace("a", "🛫") # 1 |
위 코드에서 1번 코드는 문자열 “a”를 “🛫”로 치환한 결과를 보여주며 2번은 문자열 “a”로 시작하는 문자열을 “🛫”로 치환한 결과를 기대했지만 .str.replace()
메서드는 기본적으로 정규표현식을 사용하지 않기 때문에 “^a” 라는 문자열이 없어 아무것도 치환되지 않은 것을 볼 수 있다. 3번 코드는 정규표현식을 사용하기 위해 “regex”인자에 True
를 할당하였고 그 결과 “a”로 시작하는 패턴이 “🛫”로 치환된 것을 볼 수 있다.