1. 정규 표현식
1.1 정규 표현식이란?
정규 표현식(Regular Expression)은 텍스트 내에서 문자열의 패턴을 찾기 위해 사용되는 일련의 문자와 특수문자의 조합.
이를 통해 데이터를 검색하고, 대체하고, 추출하는 등의 작업을 수행할 수 있다.
1.2 정규 표현식 사용 시기
- 데이터의 형식 검사
- 특정 패턴이나 조건에 맞는 문자열을 검색
- 데이터 정제 및 가공, 특정 정보 추출
1.3 정규 표현식의 장점
- 수동으로 검사하기 어려운 대량의 텍스트 데이터를 빠르게 처리 가능
- 다양한 문자열 패턴과 조건을 간단한 식으로 표현할 수 있어 데이터를 매우 유연하게 데이터를 다룰 수 있음.
- 정규 표현식 문법은 언어마다 거의 동일하므로, 다른 프로그래밍 언어에서도 손쉽게 활용 가능
1.4 정규 표현식 주의사항
- 복잡하거나 비효율적으로 작성된 정규 표현식은 성능 저하를 유발할 수 있음.
- 광범위하게 매치되는 패턴이 있거나, 놓친 특수 케이스가 발생할 수 있음.
- 작성한 방식에 따라 가독성이 낮아질 수 있음.
- 정규표현식 대신 간단한 문자열 처리 함수를 사용하는 것이 더 효율적일 수 있음.
2. 메타문자
2.1 메타문자란?
메타문자는 정규 표현식에서 특별한 의미를 갖는 문자들을 말한다.
이들은 단순한 글자가 아니라, 데이터를 검색하고 패턴을 정의하는 데 사용된다.
2.2 메타문자의 종류
- . : 어떤 한 개의 문자와 일치한다. 단, 행을 바꾸는 개행 문자(\n)는 제외된다.
- ^: 문자열의 시작을 나타낸다.
- $: 문자열의 끝을 나타낸다.
- |: 두 패턴 중 하나와 일치한다. OR 연산자라고 한다.
- \: 특수 문자를 일반 문자로 사용하거나, 특수 시퀀스를 나타내는 데 사용된다.
2.3 주의사항
- 메타문자는 그 자체로 특별한 의미를 갖기 때문에, 글자 그대로 매치하려면 \를 앞에 붙여 이스케이프해야 한다. 예를 들어, . 자체를 찾으려면 \. 를 사용해야한다.
- 메타문자를 사용할 때는 패턴이 어떤 문자열과 일치하는지 정확히 이해하고 사용하는 것이 중요하다.
- 메타문자를 사용할 때 예상치 못한 결과를 가져올 수 있으므로 주의해서 사용해야 한다.
3. 특수시퀀스와 반복자 이해하기
3.1 특수시퀀스란?
특수 시퀀스는 정규 표현식에서 자주 사용되는 특정 패턴을 간단한 코드로 나타낼 때 사용한다.
3.2 특수시퀀스의 종류
- \d: 모든 숫자와 일치한다. 예를 들어, \d는 '0', '1', '2', '3', .... , '9'와 매치된다.
- \D: 숫자가 아닌 모든 문자와 일치한다.
- \s: 모든 공백 문자와 일치한다.
- \S: 공백 문자가 아닌 모든 문자와 일치한다.
- \w: 문자, 숫자, 밑줄 문자와 일치한다.
- \W: \w에 해당하지 않는 모든 문자와 일치한다.
3.3 반복자란?
반복자는 특정 문자 또는 문자 집합이 몇 번 반복되어야 하는지 정의한다.
반복자를 사용하면, 동일한 문자 또는 패턴의 반복을 간결하게 표현할 수 있다.
3.4 반복자의 종류
- * : 바로 앞의 문자가 0회 이상 반복될 때 일치한다. 즉, 문자가 없거나 여러 번 있을 수 있다.
- + : 바로 앞의 문자가 1회 이상 반복될 때 일치한다. 이는 적어도 한 번은 해당 문자가 있어야 한다는 것을 의미한다.
- ? : 바로 앞의 문자가 0회 또는 1회 있을 때 일치한다. 이는 문자가 있거나 없을 수 있다는 것을 의미한다.
- {n} : 바로 앞의 문자가 정확히 n회 반복될 때 일치한다.
- {n, } : 바로 앞의 문자가 n회 이상 반복될 때 일치한다.
- {n, m} : 바로 앞의 문자가 최소 n회, 최대 m회 반복될 때 일치한다.
3.5 예시
- \d{2, 4} 는 숫자이면서 최소 2자리 최대 4자리의 연속된 숫자와 일치한다.
- \S+ 는 문자열 Hello World!가 있을 때 공백이 아닌 문자가 1회이상 연속되는 부분을 찾는다. 따라서 Hello와 World! 를 각각 별도로 찾아내어 일치시킨다.
4. 적용 예시
법규위반 열 데이터 정제 : 문자열 탐색
# '법규위반' 열에서 '안전' 단어가 포함된 경우 찾기
pattern = r'안전'
train['법규위반_안전'] = train['법규위반'].str.contains(pattern)
display(train.head(3))
r'안전'에서 r은 raw string을 나타낸다.
파이썬에서 raw string은 문자열 앞에 'r'을 붙여 표시하며 문자열 내에 특수 시퀀스(\s, \w, \등)가 특별한 처리없이 문자 그대로 취급하도록 한다.
raw string을 사용하면 이스케이프 문자가 별도의 처리 없이도 정확히 인식되기 때문에 편리하게 사용할 수 있다.
train['법규위반_안전'] = train['법규위반'].str.contains(pattern)은 train 데이터 프레임의 법규위반 열에서 각 값에 대해 패턴을 확인하고, 해당 패턴이 맞을 경우 True, 아닐 경우 False를 법규 위반_안전 열에 반환한다.
즉, str.contains 메서드는 데이터 프레임의 각 행에서 지정된 패턴 또는 문자열이 존재하는지 여부를 확인하고, 이를 통해 불리언(참/거짓) 값을 생성한다.
도로형태 열 데이터 정제 : 값 대체
# '도로형태' 열에서 ' - ' 이후 문자열 제거
pattern = r'\s-\s.*'
train['도로형태_대분류'] = train['도로형태'].str.replace(pattern, '', regex=True)
display(train.head(3))
변수 pattern에 정의된 패턴은 공백(\s)과 하이픈(-), 공백(\s)을 포함한 뒤의 모든 문자(.)를 찾는 것을 목표로 한다.
* 은 0회 이상 반복될 수 있다는 것을 의미한다.
str.replace 메서드는 정규표현식을 사용하여 문자열에서 원하는 패턴을 찾아 다른 문자열로 치환할 수 있게 해주는 함수이다.
코드는 pattern을 발견하면, 그 패턴에 해당하는 문자열을 제거('')한다.
regex = True은 해당 패턴에서 정규 표현식을 사용한다는 의미이다.
시군구 열 데이터 정제 : 캡처 그룹을 활용한 지역명 추출
캡처 그룹이란?
캡처 그룹(capture group)은 정규표현식 내에서 특정 부분을 하나의 단위로 묶기 위해 사용하는 기술이다.
이를 통해 복잡한 문자열 패턴 내에서 특정 부분을 식별하고 추출하는 데 사용된다.
각 캡처 그룹은 괄호 ()를 사용하여 정의되며, 정규표현식 내에서 하나 이상의 문자열을 그룹으로 묶을 수 있는데, 복수의 선택 사항 중 하나를 식별하고, 필요한 부분만을 추출할 수 있다.
사용방법
r'()' 의 괄호 () 안에 여러 문자열 또는 패턴을 넣어 복수의 선택지 중에서 일치하는 요소를 찾을 수 있다.
r'(창원 | 마산)' 캡처그룹은 '창원' 또는 '마산'과 일치하는 문자열을 찾는다.
이러한 방식은 데이터에서 특정 키워드나 패턴을 필터링할 때 유용하다.
또한, 캡처 그룹은 정규표현식 내에서 특정 부분의 반복을 지정하는 데에도 사용된다.
예를 들어 r'(ab)+' 는 'ab', 'abab', 'ababab' ... 등 문자열이 한 번 이상 반복되는 경우와 일치한다.
pattern = r'(남구|달서구)'
# '남구' 또는 '달서구'를 추출하고, 해당되지 않는 경우 '기타'로 표시
train['시군구_특정'] = train['시군구'].str.extract(pattern)
train['시군구_특정'] = train['시군구_특정'].fillna('기타')
display(train.head(3))
pattern = r '(남구 | 달서구)'
이 정규 표현식은 '남구' 또는 '달서구' 문자열을 찾기 위해 그루핑을 사용하였다.
train['시군구_특정'] = train['시군구'].str.extract(pattern)
위 코드는 판다스(pandas)의 str.extract 메서드를 사용하여 시군구 열(columns)이 패턴(pattern)과 일치하는 부분을 추출한다.
위의 코드를 실행한 결과, '시군구' 칼럼에 패턴에 해당하는 값이 존재하지 않을 경우 결측값이 반환된다.
fillna 메서드를 사용하여 결측값을 모두 '기타'로 대체할 수 있다.
사고일시 열 정제 : 연, 월, 일, 시간 추출
time_pattern = r'(\d{4})-(\d{2})-(\d{2}) (\d{2})'
train[['연', '월', '일', '시간']] = train['사고일시'].str.extract(time_pattern)
display(train.head(3))
time_pattern = r '(\d{4})-(\d{2})-(\d{2}) (\d{2})'
(\d{n})
이 패턴은 n자리의 숫자를 찾는데 사용된다.
여기서 \d는 숫자를 나타내고, {n}은 연속되는 숫자의 개수를 의미한다.
따라서 \d{4}는 4자리 숫자를 찾는 패턴이다.
이를 활용하여, 각 자리의 값을 순서대로 찾는데 사용되는데, 각 숫자 그룹은 하이픈(-)과 공백() 을 통해 구분된다.
train[['연', '월', '일', '시간']] = train['사고일시'].str.extract(time_pattern)
위 코드는 위에서 정의한 time_pattern을 이용하여 연, 월, 일, 시간 칼럼을 생성한다.
특이한 점은 이전 스텝에서 str.extract 메서드를 사용했을 때와 달리 연, 월, 일, 시간 4개의 반환값을 가진다.
이는 정규표현식에서 하이픈(-)을 제외한 \d{n} 형태가 각각 별도의 캡처 그룹으로 지정되기 때문이다.
정규표현식의 각 캡처 그룹은 괄호 ()를 사용하여 정의되며, 이들은 매칭된 문자열의 특정 부분을 추출하는데 사용된다.
str.extract 메서드는 이러한 캡처 그룹에 해당하는 각 부분을 별도의 칼럼으로 반환하므로, 여기서는 총 네 개의 칼럼(연, 월, 일, 시간)이 생성된다.
'프로그래밍 > 머신러닝' 카테고리의 다른 글
LightGBM (1) | 2024.09.04 |
---|---|
다변량 이상치 탐지 방법 (0) | 2024.08.25 |
로지스틱 회귀분석 (0) | 2024.08.13 |
혼자 공부하는 머신러닝 + 딥러닝(딥러닝) (0) | 2024.08.08 |
혼자 공부하는 머신러닝 + 딥러닝(머신러닝) (0) | 2024.07.19 |