본문 바로가기

배우기/복습노트[Python과 분석]

[복습] Python 파이썬의 정규식 표현식

728x90
반응형

정규식 표현식

 

^: 시작

$: 끝

[ ]: 여러 값 동시 전달 혹은 연속적 패턴 전달

  ex) [0-9], [()], [가-힣]

        [0-9-]: 가운데 하이픈은 범위, 맨 뒤의 하이픈은 패턴전달

. : (공백포함) 한 자리 글자

\ : 뒤에 오는 특수기호를 일반 기호화(escape character)

(): 그룹 추출

* : 0회 이상(없어도 되는 경우 주로 사용)

+ : 1회 이상

{i,j}: i회 이상 j회 이하 → {3,}: 3회 이상, {3}: 3

\d : 숫자

\D : 숫자가 아닌

\s : 공백이나 탭

\w : 문자 또는 숫자 또는 _ (언더바)

\W : 문자 또는 숫자 또는 _ (언더바)가 아닌 → _(언더바)를 제외한 특수 기호

 

 

예시를 들어보았다.

여기서 import re 는 정규식에 해당하는 모듈이다.

findall 메서드는 정규식 표현식에 해당하는 대상을 추출하는 메서드이다.

 

밑에서 자세히 알아보겠다.

 

 

 

 

1. findall 

  - 정규식 표현식에 해당되는 대상 추출

 

** 문법

re.findall(pattern,     # 정규식표현식

               strings)     # 문자열

 

r1.findall(string)

이때 r1은 이미 파싱된 정규식 표현식을 의미한다.

 

 

주의)

위 방법은 불가하다.

 

여기서는 r1이 파싱된 정규식 표현식이므로 가능해진다.

 

 

 

 

예) student.csv의 TEL 컬럼에서 지역번호를 추출하여라

student의 TEL은 이런 컬럼을 가지고 있다.

 

 

TypeError가 발생한다. r1.finedall은 벡터연산이 불가하기 때문이다.

 

위 같은 방법으로 해결이 가능하다.

 

 

 

예) professor.csv 파일의 EMAIL 컬럼에서 이메일 아이디를 추출하여라.

professor의 EMAIL 컬럼이다.

 

 

추출할 부분을 서브그룹 지정하여 출력하였다.

 

 

 

예) student.csv의 TEL에서 국번을 추출하여보자.

re.compile 대신 r''의 작은따옴표 안에 정규식 표현식도 전달이 가능하다.

또한 출력되는 숫자들의 대괄호를 벗기기 위해서는 뒤에 str[0]로 차원축소를 해주면 되겠다.

 

 

전화번호의 모든 숫자를 다 출력하여보자.

 

출력 결과는 맨 마지막 줄의 출력 결과만 나타난 것이다.

 

 

728x90

 

 

연습문제

교습현황.csv 파일을 읽고 동을 추출하여라.

df1 = pd.read_csv('C:/Users/*****/documents/교습현황.csv', encoding = 'cp949', skiprows = 1)

 

 

 

괄호 안의 동을 추출하여보자

대부분은 동이 추출 되었으나, 세 번째 행처럼 (사당동, 대림아파트상가A동) 같은 것도 걸러내야 되겠다.

 

 

일단 출력된 결과는 다 잘 뽑힌 것 처럼 보이나, unique 로 확인을 해보아야겠다.

 

 

 

 

unique 메서드로 살펴보니 완전히 분류되지는 않은 것 같다.

 

 

정규식 표현식을 조금 더 수정하니 동을 완전히 추출할 수 있었다.

 

 

 

 

 

반응형

 

 

 

 

 

2. sub(정규식 표현식 함수)

re.sub(pattern,   # 찾을 패턴

           repl,        # 대체 문자열

           string)     # 대상

 

정규식 표현식을 활용하여 패턴을 대체 또는 제거 할 수 있는 함수이다.

 

vstr1의 숫자가 모두 제거된다.

 

 

vstr1의 숫자가 아닌 값이 모두 제거된다.

 

^ 의 용도를 잠시 살펴보면,

^가 대괄호 앞에 오면, 대괄호 안의 문자로 시작하는, 이라는 의미이고,

^가 대괄호 안에 오면 대괄호 안의 정규식표현식 패턴이 아닌 값은 제외 한다는 의미이다.

 

 

 

참고: [ ]의 활용

[a] : a를 포함하는

[ab] : a또는 b를 포함하는

^[ab] : a또는 b로 시작하는

[^a] : a가 아닌

 

 

 

replace 메서드와 정규식 표현식

1. 기본문자열 replace

  - 정규식표현식 지원 불가

 

2. 값치환 메서드

  - 정규식표현식 지원 가능(regex = True로 변경해야 가능함)

  - regex = True 시, 문자열 메서드처럼 작동

  - DataFrame, Series 호출 가능

 

3. str.replace

  - 정규식표현식 지원 가능(regex = True로 변경해야 가능함)

  - Series만 호출 가능

 

 

 

예) replace와 정규식 표현식

1) 기본문자열 메서드

정규식표현식이 전달되지 않는다.

 

 

2) 값치환 메서드

regex = False가 default여서 문자열의 패턴을 치환하지 않는다.

 

regex = True로 설정하면 숫자 삭제 기능을 수행한다(정규식 표현식 전달 가능)

 

 

3) str.replace 메서드

str.replace 또한 숫자 삭제가 가능하다(정규식 표현식 전달 가능)

 

 

 

 

예) 정규식 표현식을 사용한 문자열 치환

professor.csv의 ID 컬럼에서 특수기호 또는 숫자를 제거하여라.

 

위와 아래 두 가지 방법이 가능하다.

그런데 둘의 방법에는 큰 차이점이 존재한다.

첫 번째 방법은 DataFrame, Series 호출이 가능하다 두 번째 방법은 Series만 호출이 가능하다.

 

 

 

 

예) card_history.csv 파일에서 천단위 구분기호를 삭제하여라

원래는 map + lambda를 이용하여 풀었던 문제인데 이제 replace만을 이용하여 풀어보자.

 

 

 

 

 

이렇게 간단히 해결된다.

 

 

 

 

 

 

연습문제

oracle_alert_testdb.log 파일을 읽고 에러코드와 에러 내용을 아래 데이터프레임 형식으로 저장하여라.

 code                              error

1109                               signalled during: ALTER DATABASE CLOSE NORMAL....

 

 

 

 

ORA-00312 번호와 그 뒤의 메시지를 분리하면 되겠다.

 

먼저 내 풀이이다.

 

 

 

다음은 선생님 해설이다.

 

 

선생님은 최종적으로 에러 코드 숫자까지 출력하셨다.

728x90
반응형