0916 - Python

오늘·2022년 9월 19일
0

A

목록 보기
15/46

복습문제

1. 정규식에서 매치된 문자열의 (시작,)에 해당하는
튜플을 돌려주는 match 객체의 메서드는?
[답변]obj.group()


2. "Life is too short"를 정규식 [A-z]+를
이용하여 단어별로 리스트 저장하세요
[답변]
import re
s = "Life is too short"
p = re.compile("[A-z]+")
p.findall(t)


3. [^a-zA-Z0-9_]와 동일한 표현식은?
[답변]
\W

3-1. 숫자와 매치되는 [0-9]와 동일한 표현식은?
[답변]\d


4. 정규식을 사용하여 숫자만 추출해보세요
[답변]
data = ''' 이름:김철수
전화번호 : 010-1234-1234
나이 : 30
성별 : 남
'''
import re
p = re.compile("\d.+")
m = p.search(data)
m.group()

[추가답변]
re.findall(r'\d+[-]\d+[-]\d+', data)
[추가답변]
p = re.compile("\d{3}-\d{4}-\d{4}")
p.search(data).group()

5. s = "black, blue and brown" 에서
brown을 제외하고 출력시켜 주세요\
[답변]
s = "black, blue and brown"
p = re.compile('.+(?=and)')
p.findall(s)
[추가답변]
s = "black, blue and brown"
p = re.compile('bl\w+')
p.findall(s)



6. 아래 문자열에서 [http, http, ftp]만 출력해주세요
[문자열]
s= '''
http://naver.com
http://google.com
ftp://daum.net
'''
[답변]
p = re.compile('.+(?=:)')
p.findall(s)

6-1. ['naver.com', 'google.com', 'daum.net'] 을 출력해주세요
[답변]
p = re.compile('(?<=//).+')
p.findall(s)


+) 만약 아래와 같이 하면
s= 'http://naver.com, http://google.com, ftp://daum.net'
p = re.compile('.+(?=:)')
p.findall(s)
> # ['http://naver.com, http://google.com, ftp']
결과가 원하는대로 나오지 않는 것을 확인할 수 있다.
이때 정규식을
p = re.compile('\w+(?=:)') 으로 하면 원하는대로 나오는 것을 확인할 수 있다
# > ['http', 'http', 'ftp']

왜지?


7. 아래 데이터에서 연달아 두 번 사용하는 단어들을 출력해주세요
(finditer 사용)
[데이터]
data = '''
안녕하세요 그리고 그리고
안녕하세요 또 또
안녕하세요 그런데 그런데 
안녕하세요 끝 끝
'''
[출제자 답변]
p = re.compile(r"(?P<repeat>\w+)\s+(?P=repeat)")
for i in p.finditer(data):
    print(i) 
[답변]
li = []
for i in re.finditer(r'(?P<word>\w+)\s+(?P=word)', data):
    li.append(i.group())
print(li)
> # ['그리고 그리고', '또 또', '그런데 그런데', '끝 끝']

7-1. findall 을 사용한다면
data = re.findall("\w*\S", data)
set(data)
> # {'그런데', '그리고', '끝', '또', '안녕하세요'}

문제

  1. 다음 긁어서 내용만 간추려보기
import urllib.request as req
import re

# 접속 가능 여부 받기(Response 값 오는 지)
# req.urlopen("http://daum.net")

# 전체 내용 읽어오기
data = req.urlopen("http://daum.net").read().decode("utf-8")
data
p = re.compile("https://\S*[.]js")
li = p.findall(data)
for i in li :
    print(i)

data = """
<div class="faZHB">
<a href="#" target="_self" role="button" aria-expanded="true" class="M_704" style="display: block;"><span class="WoYOw">
이른 아침 문을 여는 빵집입니다. 아침식사로 빵을 사러 가기엔 좋지만 매장안에서 드실 공간은 없어요.
이 빵집은 특이하게도 물 또는 커피를 무료로 텀블러에 담아갈수 있습니다. 
가볍게 아침을 해결하고자 하는 여행자나 현지인은 들러보면 좋을 장소입니다. 
참고로, 식빵 나오는 시간은 오전11시~12시 입니다. 빵 가격은 가성비 괜찮은 편이고 맛은 무난합니다. 
</span></a></div><div class="faZHB">
<a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">
우연히 들어갔는데 사장님이 따뜻하고 친절하셔서 제주도 이미지마저 좋게 느껴졌어요. 
그리고 무엇보다 빵이 정말 맛있어요. 제주도에서 원탑입니다!!! 여기보다 두배는
...</span><span class="_3_09q"><svg xmlns="
"""

# 위 데이터에서 한글문장들만 뽑낸다면
p = re.compile("[가-힣].+[가-힣]")
li = p.findall(data)
li
>
#['이른 아침 문을 여는 빵집입니다. 아침식사로 빵을 사러 가기엔 좋지만 매장안에서 드실 공간은 없어요',
# '이 빵집은 특이하게도 물 또는 커피를 무료로 텀블러에 담아갈수 있습니다',
# '가볍게 아침을 해결하고자 하는 여행자나 현지인은 들러보면 좋을 장소입니다',
# '참고로, 식빵 나오는 시간은 오전11시~12시 입니다. 빵 가격은 가성비 괜찮은 편이고 맛은 무난합니다',
# '우연히 들어갔는데 사장님이 따뜻하고 친절하셔서 제주도 이미지마저 좋게 느껴졌어요',
# '그리고 무엇보다 빵이 정말 맛있어요. 제주도에서 원탑입니다!!! 여기보다 두배는']

# 이와 같이 뽑았다. 한글-한글 사이에 있는 숫자들을 살려야 된다는 생각에
# [가-힣].+[가-힣] 이런식으로 정규식을 적었지만
# 그냥 [가-힣].+ 으로 해도 똑같이 출력이 된다.


# for 문으로 리스트 값을 뽑아주는 코드를 추가했다.
p = re.compile("[가-힣].+")
li = p.findall(data)
for i in li :
    print(i)
# 그런데 만약 아래와 같이 더 길고 문장 사이에 영어들이 있을 경우
data = """
<div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="true" class="M_704" style="display: block;"><span class="WoYOw">이른 아침 문을 여는 빵집입니다. 아침식사로 빵을 사러 가기엔 좋지만 매장안에서 드실 공간은 없어요. 이 빵집은 특이하게도 물 또는 커피를 무료로 텀블러에 담아갈수 있습니다.  가볍게 아침을 해결하고자 하는 여행자나 현지인은 들러보면 좋을 장소입니다.  참고로, 식빵 나오는 시간은 오전11시~12시 입니다. 빵 가격은 가성비 괜찮은 편이고 맛은 무난합니다. </span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">우연히 들어갔는데 사장님이 따뜻하고 친절하셔서 제주도 이미지마저 좋게 느껴졌어요. 그리고 무엇보다 빵이 정말 맛있어요. 제주도에서 원탑입니다!!! 여기보다 두배는 ...</span><span class="_3_09q"><svg xmlns="
http://www.w3.org/2000/svg
" viewBox="0 0 12 7" class="_3Dnsh" aria-hidden="true"><path d="M11.47.52a.74.74 0 0 0-1.04 0l-4.4 4.45v.01L1.57.52A.74.74 0 1 0 .53 1.57l5.12 5.08a.5.5 0 0 0 .7 0l5.12-5.08a.74.74 0 0 0 0-1.05z"></path></svg><span class="place_blind">내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">맛집검색하다가 스쳐지나갔는데 숙소근처에 있길래 들렸어요!!  시식하는빵도 있고  빵구매하는데 서비스로 흰색찹살떡??도 주시고 친절하세요! 인절미빵 강추입니다!  ...</span><span class="_3_09q"><svg xmlns="
http://www.w3.org/2000/svg
" viewBox="0 0 12 7" class="_3Dnsh" aria-hidden="true"><path d="M11.47.52a.74.74 0 0 0-1.04 0l-4.4 4.45v.01L1.57.52A.74.74 0 1 0 .53 1.57l5.12 5.08a.5.5 0 0 0 .7 0l5.12-5.08a.74.74 0 0 0 0-1.05z"></path></svg><span class="place_blind">내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">인절미빵. 먹물치즈빵? 제일 맛있었고 대파빵은 삼겹살을 부르는 꽤 매운 맛이었어요! 빵이 대체로 다~~~~맛있고 친절하십니다 주차는 근처 공영주차장에 하면 됩니다 다...</span><span class="_3_09q"><svg xmlns="
http://www.w3.org/2000/svg
" viewBox="0 0 12 7" class="_3Dnsh" aria-hidden="true"><path d="M11.47.52a.74.74 0 0 0-1.04 0l-4.4 4.45v.01L1.57.52A.74.74 0 1 0 .53 1.57l5.12 5.08a.5.5 0 0 0 .7 0l5.12-5.08a.74.74 0 0 0 0-1.05z"></path></svg><span class="place_blind">내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">사진을 제대로 못찍엇는데 뒤에 비닐로 싸진 빵들이에요 ㅋㅋㅋ  여기 진짜 촤고에요 보니 동네찐로컬맛집같아요 빵종류도 많고 각 빵마다 시식빵이 있는데 크기가 넘 커서...</span><span class="_3_09q"><svg xmlns="
http://www.w3.org/2000/svg
" viewBox="0 0 12 7" class="_3Dnsh" aria-hidden="true"><path d="M11.47.52a.74.74 0 0 0-1.04 0l-4.4 4.45v.01L1.57.52A.74.74 0 1 0 .53 1.57l5.12 5.08a.5.5 0 0 0 .7 0l5.12-5.08a.74.74 0 0 0 0-1.05z"></path></svg><span class="place_blind">내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">성산 여행하는 동안 두번이나 방문했어요 빵도 특색있고 하나하나 다 맛있고 사장님도 직원분도 친절하시고  커피도 무료로 먹을수 있게 해주시고 살때마다 서비스빵을 주...</span><span class="_3_09q"><svg xmlns="
http://www.w3.org/2000/svg
" viewBox="0 0 12 7" class="_3Dnsh" aria-hidden="true"><path d="M11.47.52a.74.74 0 0 0-1.04 0l-4.4 4.45v.01L1.57.52A.74.74 0 1 0 .53 1.57l5.12 5.08a.5.5 0 0 0 .7 0l5.12-5.08a.74.74 0 0 0 0-1.05z"></path></svg><span class="place_blind">내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">사장님 너무 친절하시고 빵이 진짜 맛있어요.. 미친 맛,,,,🥹가격이 타 빵집보다 훠얼씬 저렴한데  맛이 훠얼씬 맛있네요,,,??!?! 저희 동네에 있었음 매일 가고싶네요ㅠㅠㅠ …</span><span class="_3_09q"><svg xmlns="
http://www.w3.org/2000/svg
" viewBox="0 0 12 7" class="_3Dnsh" aria-hidden="true"><path d="M11.47.52a.74.74 0 0 0-1.04 0l-4.4 4.45v.01L1.57.52A.74.74 0 1 0 .53 1.57l5.12 5.08a.5.5 0 0 0 .7 0l5.12-5.08a.74.74 0 0 0 0-1.05z"></path></svg><span class="place_blind">내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">재료를 아끼지 않으세요 눚은시간 방문했는데도 손님들이 꽤 왔어요 마늘바게트에는 소스를 아끼지 않았고 다른빵들도 크림이 듬뿍 들어 있었어요 서비스도 주시고 시식…</span><span class="_3_09q"><svg xmlns="
http://www.w3.org/2000/svg
" viewBox="0 0 12 7" class="_3Dnsh" aria-hidden="true"><path d="M11.47.52a.74.74 0 0 0-1.04 0l-4.4 4.45v.01L1.57.52A.74.74 0 1 0 .53 1.57l5.12 5.08a.5.5 0 0 0 .7 0l5.12-5.08a.74.74 0 0 0 0-1.05z"></path></svg><span class="place_blind">내용 더보기</span></span></a></div> 
"""
# 이렇게 하면
p = re.compile("[가-힣].+[가-힣]")
li = p.findall(data)
for i in li :
    print(i)
# 아래와 같이 지져분하게 나온다
# 이른 아침 문을 여는 빵집입니다. 아침식사로 빵을 사러 가기엔 좋지만 매장안에서 드실 공간은 없어요. 이 빵집은 특이하게도 물 또는 커피를 무료로 텀블러에 담아갈수 있습니다.  가볍게 아침을 해결하고자 하는 여행자나 현지인은 들러보면 좋을 장소입니다.  참고로, 식빵 나오는 시간은 오전11시~12시 입니다. 빵 가격은 가성비 괜찮은 편이고 맛은 무난합니다. </span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">우연히 들어갔는데 사장님이 따뜻하고 친절하셔서 제주도 이미지마저 좋게 느껴졌어요. 그리고 무엇보다 빵이 정말 맛있어요. 제주도에서 원탑입니다!!! 여기보다 두배는
# 내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">맛집검색하다가 스쳐지나갔는데 숙소근처에 있길래 들렸어요!!  시식하는빵도 있고  빵구매하는데 서비스로 흰색찹살떡??도 주시고 친절하세요! 인절미빵 강추입니다
# 내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">인절미빵. 먹물치즈빵? 제일 맛있었고 대파빵은 삼겹살을 부르는 꽤 매운 맛이었어요! 빵이 대체로 다~~~~맛있고 친절하십니다 주차는 근처 공영주차장에 하면 됩니다 다
# 내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">사진을 제대로 못찍엇는데 뒤에 비닐로 싸진 빵들이에요 ㅋㅋㅋ  여기 진짜 촤고에요 보니 동네찐로컬맛집같아요 빵종류도 많고 각 빵마다 시식빵이 있는데 크기가 넘 커서
# 내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">성산 여행하는 동안 두번이나 방문했어요 빵도 특색있고 하나하나 다 맛있고 사장님도 직원분도 친절하시고  커피도 무료로 먹을수 있게 해주시고 살때마다 서비스빵을 주
# 내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">사장님 너무 친절하시고 빵이 진짜 맛있어요.. 미친 맛,,,,🥹가격이 타 빵집보다 훠얼씬 저렴한데  맛이 훠얼씬 맛있네요,,,??!?! 저희 동네에 있었음 매일 가고싶네요
# 내용 더보기</span></span></a></div><div class="faZHB"><a href="#" target="_self" role="button" aria-expanded="false" class="M_704" style="display: block;"><span class="WoYOw">재료를 아끼지 않으세요 눚은시간 방문했는데도 손님들이 꽤 왔어요 마늘바게트에는 소스를 아끼지 않았고 다른빵들도 크림이 듬뿍 들어 있었어요 서비스도 주시고 시식
# 내용 더보기

# 방향을 바꿨다. 요점은 한글을 출력하는 것이 아니라
# 화면에 출력되는 내용을 뽑고 싶은 것이니까
p = re.compile("(?=[>]).+?(?=[<])")
li = p.findall(data)
# 이렇게 해서 뽑으면
# ">" ">내용" 이런식으로 나오게 된다.
for i in li :
	# ">"가 나오는게 마음에 들지 않아 if 문을 돌리며 제거해주었다.	
    if i != '>' :
    	# '>' 만 출력되는 것은 막았으나 ">내용" 이 출력되는 것도 마음에 들지 않아 replace도 시켜줌 
        print(i.replace(">", ""))
  1. 아래 문자열 text 에서 ['http:', 'https:', 'ftp:'] 리스트를 뽑아주세요
text = '''
http://www.google.com/
https://mail.google.com/
ftp://ftp.google.com/
''' 
p = re.compile(".+(?=//)")
p.findall(text)
  1. ['50.24', '35.25', '100'] 만 뽑아주세요
text ='''apple: $50.24
banana: $35.25
pizza: $100
''' 
p = re.compile('(?<=[$]).+') 
p.findall(text)

numpy

과학계산을 위한 라이브러리로 행렬/배열 처리 및 연산과 난수 생성등 다차원 배열을 처리하는데 필요한 기능들을 제공하고 있다.

pip install numpy 로 설치할 수 있다.

연산

행열간 +,-,*,/ 등의 연산자로 연산이 가능하다. add(),substract(),multiply(),divide()

행과 열이 같은 배열을 계산하면 각 위치에 있는 값들이 계산되는 것이다.


배열

numpy 에서 배열은 동일한 타입의 값들을 가지며, 배열 차원은 rank, 각 차원의 크기를 튜플로 표시하는 것을 shape 이라 한다

예를 들어보자
행이2 열이32차원배열에서
rank = 2
shape = (2, 3)

1차원 배열을 만들어보자

# 1차원 배열 만들기
import numpy as np
# 입력은 리스트 형식
a = np.array([0, 1, 2, 3])
print(a)
> # [0 1 2 3]
a.shape
> # (4,)

a 리스트의 shape 값이 (4,)으로 나오는 것을 볼 수 있다. 튜플은 하나의 요소만 있으면 문법상 콤마를 붙이기 때문이다.

b = np.array([0, 1, 2], [3, 4, 5])
b.shape
> # TypeError: Field elements must be 2- or 3-tuples, got '3'

2x3 의 배열을 넣고 싶었는데 에러가 떴다. array() 안에는 하나의 리스트만 들어갈 수 있기 때문에 위와 같은경우

b = np.array([[0, 1, 2], [3, 4, 5]])
b.shape
> # (2, 3)

위와같이 한번 더 감싼, 리스트 안의 리스트 형태로 넣어야 오류가 나지 않는다.

numpyt에서 제공하는 배열만들기 함수를 알아보자

함수명 기능
zeros() 해당 배열의 모든 값에 0을 넣는다
ones() 해당 배열의 모든 값에 1을 넣는다
full() 배열에 사용자가 지정한 값을 넣는다
eye() 대각선으로는 1, 나머지는 0으로 채운 2차원배열을 생성한다
a = np.zeros((2,2))
print(a)
# 출력:
# [[ 0.  0.]
#  [ 0.  0.]]
 
a = np.ones((2,3))
print(a)
# 출력:
# [[ 1.  1.  1.]
#  [ 1.  1.  1.]]
 
a = np.full((2,3), 5)
print(a)
# 출력:
# [[5 5 5]
#  [5 5 5]]
 
a = np.eye(3)
print(a)
# 출력:
# [[ 1.  0.  0.]
#  [ 0.  1.  0.]
#  [ 0.  0.  1.]]
 

# 참고로 예제 실습시 이렇게 range로 갯수를 채우고
# .reshape로 행열 크기를 지정해주면 쉽게 행열을 만들 수 있다.
a = np.array(range(20)).reshape((4,5))
print(a)
# 출력:
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]
#  [15 16 17 18 19]]
# 단, 크기가 맞지 않게 reshape를 해줄경우 오류난다.

배열 슬라이싱

파이썬 리스트와 마찬가지로 슬라이스(Slice)를 지원한다. 이때는 각 차원별로 범위를 지정한다.

a = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
# array 만들기
arr = np.array(a)

# 슬라이스
# 행(1~3) 열(0~2) 부분을 슬라이싱 하겠다
sl = arr[1:3, 0:2]
print(sl)
> # [[4 5]
  #  [7 8]]
print(arr[:1])
> # [[1 2 3]]

[:] 의 모양으로 슬라이싱 할수 있다.

print(arr[:1])
> # [[1 2 3]]
print(arr[1:])
> # [[4 5 6]
  #  [7 8 9]]

리스트와 동일하게
[:1] : 처음부터 1행까지 슬라이싱 하겠다
[1:] : 1행부터 마지막까지 슬라이싱 하겠다
는 의미이다.

print(arr[::2])
> #[[1 2 3]
  # [7 8 9]]

[start:end:step] 으로 인덱스의 시작과 끝, 몇 step 마다 추출할 것인지 지정하는 방법도 리스트와 같다.

print(arr[:,2])
> [3 6 9]
print(arr[1:])
> [[4 5 6]
 [7 8 9]]
print(arr[1,:])
> [4 5 6]

[:,2] 는 행은 전체, 열은 2번째에 있는 것을 뽑겠다는 말이다.

위에서 봤듯 [1:] 은 1번행부터 마지막 행까지 뽑겠다는 말이지만, [1,:] 은 1번행과 열 전체를 뽑겠다는 말과 동일하다

팬시 인덱싱

Fancy 인덱싱은 특정 위치들만 뽑아주는 방법이다. 조건같은 것으로 일괄뽑기가 어렵거나 불규칙 적인 것들을 뽑아야 할 경우 사용된다.

유의해야 할 점은 괄호가 추가된다는 것이다.
배열명[[행1, 행2], [열1, 열2]]
이런 식으로 행 열의 위치를 콕콕 지정하면 되는 것이다. 뽑아야할 값의 (행1, 열1)이 하나의 위치값이 되는 것이다.

b = np.arange(9).reshape(3,3)
print(b)
> 
[[0, 1, 2],
 [3, 4, 5],
 [6, 7, 8]]

b[[0,2,2],[0,1,0]]
> [0, 7, 6]
# 원하는 3개의 원소값만 쏙 뽑아졌다.

문제

# 다음과 같은 6x6 array를 만들고 노란색 빨간색 파란색으로 뽑아보세요

# 다음과 같은 6x6 array를 만들고 노란색 빨간색 파란색으로 뽑아보세요
a = np.array(range(25)).reshape((5, 5))
print(a)
>
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

yellow = a[4:]
print(yellow)
> [[20 21 22 23 24]]

# 전체 행 : 1 3 열
red = a[:,[1,3]]
print(red)
>
[[ 1  3]
 [ 6  8]
 [11 13]
 [16 18]
 [21 23]]
 
 # 팬시 인덱싱
blue = a[[1, 1, 3, 3], [0, 2, 0, 2]]
print(blue)
> [ 5  7 15 17]

0개의 댓글