[python] 정규 표현식(re)

woojjn·2022년 1월 23일
0

python 기초

목록 보기
9/10

정규식 연습장(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}$

python에서 정규식 사용하기

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 값중 두 번째 값

0개의 댓글