정규 표현식 시작하기

CHOI CHOI·2024년 6월 27일
0

파이썬 중급

목록 보기
24/30

정규표현식이란

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

정규 표현식 사용 시기

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

정규 표현식의 장점

  • 수동으로 검사하기 어려운 대량의 텍스트 데이터를 빠르게 처리할 수 있음
  • 다양한 문자열 패턴과 조건을 간단한 식으로 표현할 수 있어 데이터를 매우 유연하게 다룰 수 있음
  • 정규 표현식 문법은 언어마다 거의 동일하므로, 다른 프로그래밍 언어에서도 손쉽게 활용 가능

정규 표현식 주의사항

  • 복잡하거나 비효율적으로 작성된 정규 표현식은 성능저하를 유발할 수 있음
  • 광범위하게 매치되는 패턴이 있거나, 놓친 특수케이스가 발생할 수 있다
  • 작성한 방식에 따라 가독성이 낮아질 수 있음
  • 정규표현식 대신 간단한 문자열 처리 함수를 사용하는 것이 더 효율적일 수 있다

메타문자란

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

메타 문자의 종류

  • . :어떤 한 개의 문자와 일치한다. 단, 행을 바꾸는 개행 분자(\n)는 제외
  • ^ :문자열의 시작을 나타낸다
  • $ :문자열의 끝을 나타낸다
  • | : 두 패턴 중 하나와 일치 (or연산자)
  • \ :특수문자를 일반 문자로 사용하거나, 특수 시퀸스를 나타내는데 사용

특수 시퀸스와 반복자 이해하기

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

특수 시퀸스의 종류

  • \d : 모든 숫자와 일치. 예를 들어, \d는 '0','1','2'...,'9'와 매치
  • \D : 숫자가 아닌 모든 문자와 일치
  • \s : 모든 공백 문자와 일치
  • \S : 공백 문자가 아닌 모든 문자와 일치
  • \w : 문자, 숫자, 밑줄 문자와 일치
  • \W : \w에 해당하지 않은 모든 문자와 일치

특수시퀸스의 경우 많아보일 수 있으나 \d가 숫자를, \s는 공백을, \w가 모든 문자를 의히한다면 대문자는 그 반대에 대해 일치한다고 외우면 된다!

반복자의 종류

  • * : 바로 앞의 문자가 0회이상 반복될 때 일치한다. 즉, 문자가 없거나 여러 번 있을 수 있다
  • + : 바로 앞의 문자가 1회 이상 반복될 때 일치. 이는 적어도 한 번은 해당 문자가 있어야 한다는 것을 의미
  • ? : 바로 앞의 문자가 0회 또는 1회 있을 때 일치
  • {n} : 바로 앞의 문자가 정확히 n번 반복될 때 일치
  • {n,} : 바로 앞의 문자가 n회 이상 반복 될 때 일치
  • {n,m}: 바로 앞의 문자가 최소 n회, 최대 m회 반복될 때 일치

예시
\d{2,4}는 숫자이면서 최소 2자리 최대4자리의 연속된 숫자와 일치
\S+는 문자열 Hello World!가 있을 때 공백이 아닌 문자가 1회 이상 연속되는 부분을 찾습니다. 따라서 Hello와 World!를 각각 별도로 찾아내어 일치

코드예시

str.contains 메서드를 사용하여 법규위반 칼럼에 안전 값이 있으면 True, 아니면 False를 반환하고, 그 결과를 법규위반_안전 칼럼에 저장해주세요.

# '법규위반' 열에서 '안전' 단어가 포함된 경우 찾기
pattern = r'안전'
train['법규위반_안전'] = train['법규위반'].str.contains(pattern)

display(train.head(3))

str.replace 함수를 사용하여 도로형태 칼럼의 값에서 공백(\s), 하이픈(-), 공백(\s)을 포함한 이후의 모든 문자(.*)를 모두 제거('')하여, 각 값의 첫 번째 단어만 남겨보세요.

# '도로형태' 열에서 ' - ' 이후 문자열 제거
pattern = r'\s-\s.*'
train['도로형태_대분류'] = train['도로형태'].str.replace(pattern, '', regex=True)

display(train.head(3))

str.extract 메서드를 사용하여 시군구 칼럼에 '남구' 혹은 '달서구'가 존재할 경우 해당 값을 추출한 후 시군구특정 열에 저장해보세요.
시군구 열에 해당 값이 존재하지 않을 경우 시군구
특정 칼럼의 값을 '기타'로 저장합니다.

pattern = r'(남구|달서구)'

# '남구' 또는 '달서구'를 추출하고, 해당되지 않는 경우 '기타'로 표시
train['시군구_특정'] = train['시군구'].str.extract(pattern)
train['시군구_특정'] = train['시군구_특정'].fillna('기타')

display(train.head(3))
profile
뭐가 됐든 데이터분석가

0개의 댓글