본문 바로가기
파이썬 (Python)/General

Python 파이썬 re, ravel, flatten 함수를 이용해보기

by ★√★ 2021. 2. 15.

안녕하세요, Davey 입니다. 오늘은, "r" 로 시작하는 함수와 그와 관련된 함수를 설명 할 예정입니다. 오늘 설명할 함수는, re, ravel, flatten 함수 입니다. "re" 은 파이썬의 기본 함수이고, "ravel, faltten"은 numpy 함수 입니다. 그럼 차근 차근 한번 설명해보도록 하겠습니다.

 

1. re 함수

: 간단하게 말씀드리면, search 함수로서, 정해진 값에, 조건값이 존재하는지에 대해서 검사하는 함수라고 생각합니다. 여러가지 patten으로 검사가 가능하므로, 대량의 데이터를 다룰 때, 일괄적으로, 조건을 줘서 결과를 뽑는데 유용하다고 생각합니다. 기본 구문은 아래와 같습니다.

 

- re를 사용하려면, import를 이용하여, 선언을 해주셔야 합니다.

 

import re



검토할 변수 = search (조건값, 검사를 할 대상 값)

- 말로 설명할려고 하니까, 좀 까다롭네요. 그럼 이해를 돕게 위해서, 아래와 같이 예문을 통해서 설명드리도록 하겠습니다. 여러가지 Case를 다루도록 하겠습니다.

 

Case #1 검색을 위한 기본 구문

 

import re



search01 = re.search(r'test01', 'test01_verification')   # 'test01_verification' 에, 'test01' 가 존재하는 지 검토함.


print('----- search01 result -----\n')

print(search01.start())
print(search01.end())
print(search01.group())

 

- 위 코드를 실행 시켜보면, 아래와 같이 'test01' 가 존재하므로, 어디에 위치해 있는, 위치 Index가 출력되는 걸 보실 수 있습니다. 그리고 마지막으로, 그 자체 문자 group이 출력이 되는 걸 확인 하실 수 있습니다.

Case #2 조건 값을 가지고 검색을 하는 구문 Part 1

 

import re

search02 = re.search(r'[abc]test01', 'atest01bc')    # '[abc]' 중에 하나라도 존배하고, 그 다음에, 'test01'이 나오는지 확인



print('----- search02 result -----\n')

print(search02.start())
print(search02.end())
print(search02.group())

 

 

- 위 코드를 실행 시켜보면, 아래와 같이 'test01' 앞에 'a' 존재하므로, 존재하는 문자가 어디에 위치해 있는, 위치 Index가 출력되는 걸 보실 수 있습니다. 그리고 마지막으로, 그 자체 문자 group이 출력이 되는 걸 확인 하실 수 있습니다.

 

 

Case #2 조건 값을 가지고 검색을 하는 구문 Part 2

 

import re



verification01 = re.search(r'\d\d', '111333_Test_112233')          # 숫자가 연속으로 2번 연속 하는 경우가 있는지 검토

verification02 = re.search(r'\d\d\d', '111333_Test_112233')      # 숫자가 연속으로 3번 연속 하는 경우가 있는지 검토

verification03 = re.search(r'\d\d\d\d', '111333_Test_112233')  # 숫자가 연속으로 4번 연속 하는 경우가 있는지 검토



verification04 = re.search(r'\d\w', '1a11a33_Test_112233')       

# 숫자, 문자가 연속으로 4번 연속 하는 경우가 있는지 검토



verification05 = re.search(r'\W\W', '^%B111B')       # 특수문자가 2번 연속하는 경우가 있는지 검토

verification06 = re.search(r'\s\W', '^%B ^^111B')    # 띄어쓰기가 있고, 특수문자가 나오는 경우가 있는지 검토
verification07 = re.search(r'\S\W', '^%B 111B')      # 띄어쓰기가 없고, 특수문자가 나오는 경우가 있는지 검토


print('----- verification01 result -----') 
print(str(verification01) +'\n')

print('----- verification02 result -----') 
print(str(verification02)+'\n')

print('----- verification03 result -----')
print(str(verification03)+'\n')

print('----- verification04 result -----')
print(str(verification04)+'\n')

print('----- verification05 result -----')
print(str(verification05)+'\n')

print('----- verification06 result -----')
print(str(verification06)+'\n')

print('----- verification07 result -----\n')
print(str(verification07)+'\n')

 

 

 

 

- 위 코드를 실행 시켜보면, 아래와 같이 각 case 마다 주어진 조건에 따라, 있는지 확인을 합니다. 이해를 돕기 위해 아래과 같이 각 문자마다 무슨 의미를 가지고 있는 말씀 드리겠습니다. 

 

 

1) \d : 숫자

2) \D : 숫자가 아닌 문자

3) \s : 공백 문자

4) \S : 공백이 아닌 문자

5) \w : 알파벳대소문자, 숫자

6) \W : 알파벳대소문자, 숫자가 아닌것.

 

 

 

2. ravel() 함수

 

: 이 ravel 함수는 numpy 의 함수로서, 여러 행렬의 함수를 하나의 행 or 열로 변환을 해주는 함수 입니다. 아래 설명 드릴, flatten() 도 같은 기능을 가지고 있지만, 차이점은, source data를 같이 수정을 하냐 안하냐의 차이입니다. ravel의 경우는, 기존의 데이터를 그대로 가지고 있는 상태에서 구현. 즉, 값을 바꾸게 되면, 이전 source 데이터도 변경이 되는 함수 입니다. 기본 구문은 아래와 같습니다. 

 

import numpy as np



np.ravel (변환 할 행렬)

 

 

- 간단한, 예제를 통해서, 이해를 돕도록 하겠습니다. 

 

import numpy as np

 

test01 = np.arange(50).reshape(5,10)

 

print(test01)

 

test02 = test01.ravel()

 

test02[0] = 100

 

print()

 

print(test01)

 

print()

 

print(test02)

 

- 위 코드를 실행 시켜보면, 아래와 같이 5x10 의 행렬이 한 1x50 행렬도 변환이 된 것을 확인 하실 수 있습니다. 그리고, ravel로 변환 후, 받은 값을 수정을 하면, ravel 을 받은 행렬의 값이 수정이 되는 걸 확인 하실 수 있습니다. 

 

3. flatten () 함수

: 이 flatten 함수는 numpy 의 함수로서, 여러 행렬의 함수를 하나의 행 or 열로 변환을 해주는 함수 입니다. 위에 설명 드린, ravel 함수와의 차이점은 위에서 말씀 드린 것 처럼, source data를 같이 수정을 하냐 안하냐의 차이입니다. ravel은,  기존의 데이터를 그대로 가지고 있는 상태에서 구현. 즉, 값을 바꾸게 되면, 이전 source 데이터도 변경이 되는 함수였다면, flatten 함수는 기존의 값을 copy해서, 원래 source 값은 변환이 안되는 함수 입니다. 기본 구문은 아래와 같습니다. 

import numpy as np



np.flatten (변환 할 행렬)

 

- ravel 과 마찬가지로, 간단한, 예제를 통해서, 이해를 돕도록 하겠습니다. 

 

import numpy as np

 

test01 = np.arange(50).reshape(5,10)

 

print(test01)

 

test02 = test01.flatten()

 

test02[0] = 100

 

print()

 

print(test01)

 

print()

 

print(test02)

 

- 위 코드를 실행 시켜보면, 아래와 같이 5x10 의 행렬이 한 1x50 행렬도 변환이 된 것을 확인 하실 수 있습니다. 그리고, ravel가 다르게, 변환 후, 받은 값을 수정을 하면, 기존의 souce data는 수정이 되지 않은 걸 확인 하실 수 있습니다. 

 


그리고 추가적으로, 다차원의 배열을, 한 줄로 표현을 해줄 때, 행을 기준으로 할거냐, 아니면 열을 기준을 할거냐를 결정해서, 펴줄 수 있습니다. 공통적인 것이니, ravel을 이용하여 설명 드리겠습니다.  

1) ravel (C) - 행 기준으로 값을 출력
2) ravel (F) - 열 기준으로 값을 출력함. 

 

import numpy as np

 

test01 = np.arange(50).reshape(5,10)

 

print(test01)

 

print()

 

test02 = test01.ravel(order = 'C')   # 행 방향으로 한 행으로 펴줌

test03 = test01.ravel(order = 'F')   # 열 방향으로 한열로 펴줌

 

print(test02)

 

print()

 

print(test03)

 

 

- 위 코드를 실행 시켜보면, 아래와 같이 5x10 의 행렬이 한 1x50 행렬도 변환이 된 것을 확인 하실 수 있습니다. 그런데, order = 'C' 값으로 준것은, 0,1,2,3,4,... 행 방향으로 변환을 하였고, order = 'F' 값으로 준것은, 0,10,20,30 .... 열방향으로 변환이 된 것을 확인 하실 수 있습니다.

 

이상입니다. 'r' 이 들어가는 함수만 한번 같이 정리해보자는 취지로 했는데, 그와 관련된, 함수 flatten도 같이 다루니까, 설명하기 더 수월했던 거 같습니다. 한 번 보시고, 직접 실행을 통해서 자기 것으로 만드시길 바라겠습니다. 항상 애기 드리지만, 같이 성장하시죠! 감사합니다. 

 

제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다.


[저작권이나권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다검토  수정  삭제 조치 하도록 하겠습니다그리고기재되는 내용은 개인적으로 습득한 내용이므로 오류가 발생할  있을 가능성이 있으므로기재된 내용은 참조용으로만 봐주시길 바랍니다게시물에오류가 있을때도, Comment 달아 주시면검증 결과를 통해수정하도록 하겠습니다.]

 

 

 

 

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab