Search

정규 표현식

배경

텍스트 데이터 내에서 문자열의 패턴을 찾기 위해 사용되는 일련의 문자와 특수문자의 조합
이를 통해 데이터를 검색하고, 대체하고, 추출하는 등의 작업을 수행할 수 있다.

목적

데이터의 형식 검사
특정 패턴이나 조건에 맞는 문자열을 검색
데이터 정제 및 가공, 특정 정보 추출

장점

정규 표현식의 문법은 언어마다 거의 동일하기때문에 다른 프로그래밍 언어에서도 손쉽게 사용 가능하다.

주의사항

정규표현식 대신 간단한 문자열 처리 함수를 사용하는 것이 더 효율적일 수도 있다
비효율적으로 작성된 정규식은 성능 저하를 유발할 수 있다

메타문자

정규 표현식에서 특별한 의미를 갖는 문자들을 일컬음 단순한 글자가 아니라 데이터를 검색하고 패턴을 정의하는 데 사용됨

메타문자의 종류

. : 한 개의 문자와 일치. (개행 문자(\n)는 제외)
^ : 문자열의 시작
$ : 문자열의 끝
| : 두 패턴 중 하나와 일치(OR 연산자)
\ : 특수 문자를 일반 문자로 사용하거나, 특수 시퀀스를 나타내는 데 사용
 주의 사항 - 메타문자는 그 자체로 특별한 의미를 갖고 있기 때문에 글자 그대로 사용하려면 \를 앞에 붙여서 이스케이프해야 한다

특수 시퀀스

정규 표현식에서 자주 사용되는 특정 패턴을 간단한 코드로 나타낼 때 사용

특수 시퀀스 종류

\d : 모든 숫자와 일치
\D : 숫자가 아닌 모든 문자와 일치
\s : 모든 공백 문자와 일치
\S : 공백 문자가 아닌 모든 문자와 일치
\w : 문자, 숫자, 밑줄 문자와 일치
\W : \w에 해당하지 않는 모든 문자와 일치
 TIP \d숫자, \s공백, \w모든 문자를 의미한다고 생각하고 대문자는 그 반대에 대해 일치한다고 생각하자

반복자

특정 문자 또는 문자 집합이 몇 번 반복되어야 하는지 정의함 반복자를 사용하면 동일한 문자 또는 패턴의 반복을 간결하게 표현 가능

반복자의 종류

* : 바로 앞의 문자가 0회 이상 반복될 때 일치(문자가 없거나 여러 번 있을 수 있음)
+ : 바로 앞의 문자가 1회 이상 반복될 때 일치(적어도 한 번 이상은 문자가 있어야 함)
? : 바로 앞의 문자가 0회 또는 1회 있을 때 일치(문자가 없거나 있을 수 있음)
{n} : 바로 앞의 문자가 정확히 n회 반복될 때 일치
{n,} : 바로 앞의 문자가 n회 이상 반복될 때 일치
{n,m} : 바로 앞의 문자가 최소 n회, 최대 m회 반복될 때 일치
ex) \d{2,4} : 숫자이면서 최소 2자리 최대 4자리의 연속된 숫자와 일치
\S+ : 공백이 아닌 문자가 1회 이상 반복되는 부분을 찾음

Dacon 실습 - 2023년 11월에 개최된 ‘대구 교통사고 피해 예측 AI 경진대회’

1.
str.contains 메서드
ex) 특정 칼럼에 원하는 문자 형태를 포함한 값이 있으면 True, 아니면 False를 반환하고, 그 결과를 새로운 칼럼에 저장하기
# '법규위반' 열에서 '안전' 단어가 포함된 경우 찾기 pattern = r'안전' train['법규위반_안전'] = train['법규위반'].str.contains(pattern)
Python
복사
r : ‘raw string’ 을 의미. 문자열 내 특수 시퀀스(\s, \w, \ 등) 처리 없이 문자 그대로 취급되도록 함
2.
str.replace 메서드
문자열에서 특수 문자를 제거, 텍스트 형식을 맞추고자 할 때(ex. 국가 코드인 ‘UAE’를 모두 ‘아랍에미리트’로 일괄 변경) 사용한다.
→ 문자열에서 원하는 패턴을 찾아 다른 문자열로 치환할 수 있게 해준다.
ex) 특정 컬럼의 값에서 공백(\s) , 하이픈(-), 공백(\s)을 포함한 이후의 모든 문자(.*)를 모두 제거(’’)하여, 각 값의 첫 번째 단어만 남기기
# '도로형태' 열에서 ' - ' 이후 문자열 제거 pattern = r'\s-\s.*' # 공백과 하이픈, 공백을 포함한 뒤의 모든 문자를 찾음 train['도로형태_대분류'] = train['도로형태'].str.replace(pattern,'',regex=True)
Python
복사
regex=True : 해당 패턴에서 정규 표현식을 사용함을 의미
3.
str.extract
특정 칼럼에 원하는 문자열을 포함할 경우, 해당 값을 추출한 뒤에 특정 열에 저장
 캡처 그룹
정규 표현식 내에서 특정 부분을 하나의 단위로 묶기 위해 사용하는 기술
문자열 패턴 내에서 특정 부분을 식별하고 추출하는 데 유용
캡처 그룹은 ()를 사용해서 정의
정규표현식 내에서 하나 이상의 문자열을 그룹으로 묶을 수 있음
복수의 선택 중 하나를 식별하고 필요한 부분만 추출할 수 있음
︎ 사용 방법
r’()’ 의 괄호 안에 여러 문자열 또는 패턴을 넣어 복수의 선택지 중 일치하는 요소를 찾을 수 있음
ex) r’(남구|달서구)’ 캡처그룹은 ‘남구’ 또는 ‘달서구’와 일치하는 문자열을 찾음
캡처 그룹은 특정 부분의 반복을 지정하는 데에도 사용됨
ex) r’(ab)+’ 는 ‘ab’ , ‘abab’, ‘ababab’ …등
ex) str.extract 메서드를 사용해 시군구 칼럼에 ‘남구’ 혹은 ‘달서구’가 존재할 경우 해당 값을 추출한 뒤 시군구_특정 열에 저장. 존재하지 않을 경우 ‘기타’ 로 저장
pattern = r'(남구|달서구)' # '남구' 또는 '달서구'를 추출하고, 해당되지 않을 경우 '기타'로 표시 trian['시군구_특정'] = train['시군구'].str.extract(pattern) train['시군구_특정'] = train['시군구_특정'].fillna('기타')
Python
복사
4.
문자열 형태로 된 연월일시간 열 데이터 정규표현식으로 분리하기
그룹, \d, 반복자를 사용해 패턴을 정의해서 문자 형태로 된 날짜컬럼에서 연도, 월, 일, 시간 값을 추출해 연, 월, 일, 시간 칼럼에 각각 저장
time_pattern = r'(\d{4})-(\d{2})-(\d{2}) (\d{2})' train[['연','월','일','시간']] = train['사고일시'].str.extract(time_pattern)
Python
복사
(\d{n}) : n자리 숫자를 찾음 각 캡처 그룹은 괄호 ()를 사용해서 정의됨.