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)
> # {'그런데', '그리고', '끝', '또', '안녕하세요'}
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(">", ""))
text = '''
http://www.google.com/
https://mail.google.com/
ftp://ftp.google.com/
'''
p = re.compile(".+(?=//)")
p.findall(text)
text ='''apple: $50.24
banana: $35.25
pizza: $100
'''
p = re.compile('(?<=[$]).+')
p.findall(text)
과학계산을 위한 라이브러리로 행렬/배열 처리 및 연산과 난수 생성등 다차원 배열을 처리하는데 필요한 기능들을 제공하고 있다.
pip install numpy 로 설치할 수 있다.
행열간 +,-,*,/ 등의 연산자로 연산이 가능하다. add(),substract(),multiply(),divide()
행과 열이 같은 배열을 계산하면 각 위치에 있는 값들이 계산되는 것이다.
numpy 에서 배열은 동일한 타입의 값들을 가지며, 배열 차원은 rank, 각 차원의 크기를 튜플로 표시하는 것을 shape 이라 한다
예를 들어보자
행이2 열이3인 2차원배열에서
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]