정규식 연습장(http://www.regexr.com/)에서 연습 가능
문자 클래스 []: []의 문자들과 매치
ex) [abc]: 해당 글자가 a,b,c중 하나가 있다.
"-"를 이용하여 범위를 지정할 수 있음
ex) [a-zA-Z]: 알파벳 전체 / [0-9]: 숫자 전체
메타 문자
. ^ $ * + ? { } [ ] \ | ( )
".": 줄바꿈 문자("\n")를 제외한 모든 문자와 매치
"^": not
"*": 앞에 있는 글자를 반복해서 나올 수 있음
"+": 앞에 있는 글자를 최소 1회 이상 반복
"?": 반복 횟수가 1회
"{m, n}": 반복 횟수 지정(m부터 n까지)
"\": 원래 문자 지정 및 타입 지정(ex. \d: digit)
"|": or
전화 번호
010-0000-0000 -> ^\d{2,3}\-\d{4}\-d{4}$
IP 주소
203.252.101.40 -> ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$
이메일
woojjn_blog@ve_log.com -> ^[_a-zA-Z0-9]+@[_a-zA-Z0-9]+\.[_a-zA-Z0-9]+$
주민등록번호
991231-1234567 -> ^\d{6}\-[1-4]\d{6}$
search() 함수: 한 개만 찾기
findall() 함수: 전체 찾기
주어진 url의 html에서 http로 시작하여 zip으로 끝나는 리스트 얻기
import re
import urllib.request
url = "http://www.google.com/googlebooks/uspto-patents-grants-text.html"
html = urllib.request.urlopen(url) # url 열기
html_contents = str(html.read().decode("utf8"))
url_list = re.findall(r"(http)(.+)(zip)", html_contents)
for url in url_list:
print("".join(url))
삼성 주식 정보 url에서 다음과 같은 html 정보를 얻기
<dl class="blind">
<dt>종목 시세 정보</dt>
<dd>2020년 01월 17일 16시 10분 기준 장마감</dd>
<dd>종목명 삼성전자</dd>
<dd>종목코드 005930 코스피</dd>
<dd>현재가 61,300 전일대비 상승 600 플러스 0.99 퍼센트</dd>
<dd>전일가 60,700</dd>
<dd>시가 61,900</dd>
<dd>고가 62,000</dd>
<dd>상한가 78,900</dd>
<dd>저가 61,000</dd>
<dd>하한가 42,500</dd>
<dd>거래량 15,451,576</dd>
<dd>거래대금 949,344백만</dd>
</dl>
import re
import urllib.request
url = "http://finance.naver.com/item/main.nhn?code=005930"
html = urllib.request.urlopen(url)
html_contents = str(html.read().decode("ms949"))
stock_results = re.findall("(\<dl class=\"blind\"\>)([\s\S]+?)(\<\/dl\>)", html_contents)
samsung_stock = stock_results[0] # 두 개 tuple 값중 첫번째 패턴
samsung_index = samsung_stock[1] # 세 개의 tuple 값중 두 번째 값
# 하나의 괄호가 tuple index가 됨
index_list= re.findall("(\<dd\>)([\s\S]+?)(\<\/dd\>)", samsung_index)
for index in index_list:
print (index[1]) # 세 개의 tuple 값중 두 번째 값