정규표현식
장점
- 문자열 추출, 유효성 검사에서 유용하게 쓰임
- 거의 모든언어에서 지원
단점
- 가독성이 좋지 못함
- 유지보수가 힘듦
정규표현식 연습 사이트
https://regexr.com
Flgs
Character classes
. | 개행 문자를 제외한 모든 문자 |
\w \d \s | 단어, 숫자, 공백 |
\W \D \S | 단어, 숫자, 공백이 아님 |
[abc] | a , b 또는 c 중 하나 |
[^abc] | a, b, c가 아님 |
[a-g] | a , g 사이의 문자 |
Anchors
^abc$ | 문자열의 시작 / 끝 |
\b \B | 단어, 단어가 아닌 경계 |
Escaped Characters
\. \* \\ | 이스케이프된 특수 문자 |
\t \n \r | 탭, 줄바꿈, 캐리지 리턴 |
Quantifiers & Alternation
a* a+ a? | 0 이상, 1 이상, 0 또는 1 |
a{5} a{2,} | 정확히 5개, 2개 또는 그 이상 |
a{1,3} | 하나와 셋 사이 |
a+? a{2,}? | 가능한 한 적게 일치 |
ab|cd | ab 또는 cd와 일치 |
Groups & Lookaround
(abc) | 캡처 그룹 |
\1 | 그룹 #1에 대한 역참조 |
(?:abc) | 비 캡처 그룹 |
(?=abc) | 긍정적인 전망 |
(?!abc) | 부정적인 전망 |
re 모듈
종류 | 기능 | 찾는경우 | 없는경우 |
match | 문자열 처음부터 검색 | match object 1개 | None |
search | 문자열 전체를 검색 | match object 1개 | None |
findall | 문자열 전체를 검색 | 문자열 리스트 | 빈 리스트 |
finditer | 문자열 전체를 검색 | match object iterator | None |
fullmatch | 패턴과 문자열이 남는부분이 없이 완벽하게 일치 | match object 1개 | None |
match 객체의 메서드
종류 | 기능 | ex) |
group | 매칭된 문자열을 반환 | people |
start | 매칭된 문자열의 시작 위치 | 5 |
end | 매칭된 문자열의 끝 위치 | 11 |
span | 매칭된 문자열의 (시작, 끝) 튜플 | (5,11) |
실습
import re
# 1. re 메서드의 모듈
str = 'love people around you, love your work, love yourself'
# match : 문자열의 처음부터 검색
result = re.match('love', str)
print(result)
# search : 문자열의 전체를 검색 (결과: 1개의 match 객체)
result = re.search('people', str)
print(result)
# findall : 문자열의 전체를 검색 (결과: 문자열리스트)
results = re.findall('love', str)
print(results)
#finditer : 문자열의 전체를 검색 (결과: match 객체 이터레이터)
results = re.finditer('love', str)
print(results)
for result in results:
print(result)
# fullmatch : 패턴과 문자열이 완벽하게 일치하는지 검사
str2 = 'Hey Guys, read books'
result = re.fullmatch('.*', str2)
print(result)
# 2. match object의 메서드
result = re.search('people', str)
# 1) group(): 매칭된 문자열 반환
print(result.group())
# 2) start() : 매칭된 문자열의 시작 위치 반환
print(result.start())
# 3) end() : 매칭된 문자열의 끝 위치 반환
print(result.end())
# 4) span() : 매칭된 문자열의 시작, 끝 위치 튜플을 반환
print(result.span())
group 메서드
import re
# 1. Group
# 1) 매칭되는 문자열 한개
str1 = '010-2343-3333'
result = re.match('\d{2,3}-\d{3,4}-(\d{4}$)', str1)
print(result.group(1))
# 2) 매칭되는 문자열 여러개
str2 = '010-2343-7888, 010-2343-1234, 010-2343-5678, 010-2343-9999, 010-2343-2222'
results = re.finditer('\d{2,3}-\d{3,4}-(\d{4})(?=,|$)',str2)
for idx,result in enumerate(results,1):
print(f'{idx}. {result.group(1)}')
# 2. Substitution (교체)
str3 = '010-2343-3333'
result = re.sub('(?<=\d{3}-\d{4}-)\d{4}', '****', str3)
print(result)
정규표현식 실습문제
# 날짜형식 검사하는 정규표현식
# 1. 연도는 4자리 수자로 제한한다(1000~9999)
# 2. 월은 1월~12월, 일은 1일~31일 까지 가능하다
import re
datas = [
'2022/08/08',
'1000/01/01',
'9999/12/31',
'900/02/02',
'12000/10/26',
'2021/13/01 ',
'2023/2/02',
'2024/06/3',
'2023/06/35'
]
regex = '^\d{4}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])$'
for data in datas:
matchObj = re.match(regex, data)
result = (lambda x : True if x != None else False)(matchObj)
print(f'{data} {result}')
# 실습문제 2
# 이메일 형식을 올바르게 작성했는지 검사하는 정규표현식
# 1.이메일은 id파트와 host파트가 있다
# 2. id파트는 영문 대소문자, 숫자, 특수문자( -_)가 들어갈 수 있다.
# 3. host파트는 영문 대소문자, 숫자, 특수문자(-)
# 4. host파트는 2개이상의 도메인으로 구성될 수 있다.
datas2 = [
'startcoding@maver.com',
'start-coding@maver.com',
'start_coding@maver.co.kr',
'startcoding@k-mail.com',
'@maver.com',
'startcoding?@k-mail.com',
'startcoding@k-mail',
'startcoding@maver'
]
regex2 = '^[\w-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
for data2 in datas2:
matchObj = re.match(regex2, data2)
result = (lambda x : True if x != None else False)(matchObj)
print(f'{data2} {result}')
스레드와 프로세스
스레드
- 프로세스는 기본적으로 하나의 스레드로 구성
- 경우에 따라 여러 개의 구성이 가능함 ( 멀티 스레딩 )
멀티 스레딩 ( Multi-threading )
- 동시성 프로그래밍
- 동시에 실행되는 것처럼 보이는 것
- 스레드 여러 개를 번갈아 가면서 실행
멀티 프로세싱 ( Multi-Processing )
- 병렬성 프로그래밍
- 실제로 작업이 동시에 실행되는 것
- 프로세스를 여러 개 만들어서 동시에 실행
Treading 모듈
# 예제 1
import threading
# 스레드에서 실행할 함수
def work():
print("[sub] start")
keyword = input("[sub] 검색어를 입력하세요 : ")
print(f"[sub] {keyword}로 검색을 시작합니다.")
print("[sub] end")
# 메인스레드 실행
print("[main] start")
worker = threading.Thread(target=work)
worker.daemon = True
worker.start()
print("[main] 스레드는 자기할일을 합니다.")
print("[main] end")
# 예제 2
import threading
import time
# 주식 자동매매
# 매수, 매도
# 매수 스레드
def buyer():
for i in range(5):
print('[매수] 데이터 요청중..')
time.sleep(1)
print('[매수] 데이터 요청중..')
time.sleep(1)
print('[매수] 매수타이밍 입니다')
time.sleep(1)
print('[매수] 데이터 요청중..')
time.sleep(1)
# 매도 스레드
def saler():
for i in range(5):
print('[매도] 데이터 요청중..')
time.sleep(1)
print('[매도] 데이터 분석중..')
time.sleep(1)
print('[매도] 매수타이밍 입니다')
time.sleep(1)
print('[매도]를 요청중..')
time.sleep(1)
# 메인 스레드
print("[메인] 스레드")
buyer = threading.Thread(target=buyer)
saler = threading.Thread(target=saler)
buyer.start()
saler.start()
buyer.join()
saler.join()
print("장 종료")
Mulit Processing 모듈
# 예제1
import multiprocessing as mp
# 프로세스에서 실행할 함수
def sub_process(name):
print("[sub] start")
print(name)
print("[sub] end")
# 메인 프로세스
if __name__ == "__main__":
print("[main] start")
p = mp.Process(target=sub_process, args=('startcoding',))
p.start()
cp = mp.current_process()
print(f"[main] pid : {cp.pid}")
print("[main] end")
# 예제2
from multiprocessing import Process
import time
class Subprocess(Process):
def __init__(self, name):
Process.__init__(self)
self.name = name
def run(self):
print(f"[sub] {self.name} start")
time.sleep(5)
print(f"[sub] {self.name} end")
if __name__ == "__main__":
print("[main] start")
p = Subprocess(name='startcoding')
p.start()
p.join()
print("[main] end")
# 예제3
from multiprocessing import Process
import time
class Subprocess(Process):
def __init__(self, name):
Process.__init__(self)
self.name = name
def run(self):
print(f"[sub] {self.name} start")
time.sleep(5)
print(f"[sub] {self.name} end")
if __name__ == "__main__":
print("[main] start")
p = Subprocess(name='startcoding')
p.start()
time.sleep(1)
# 프로세스가 살아있는지 검사
if p.is_alive():
p.terminate()
print("[main] end")
# 추가학습
# 1. 스레드간 데이터 처리(lock)
# 2. 프로세스간 데이터 전송 (Queue, Pipe)
# 3. 속도비교
# 4. 운영체제와 메모리
HTML / CSS / JavaScript
HTML ( Hyper Text Markup Language )
페이지의 제목, 문단, 표, 이미지, 동영상 등 웹의 구조를 담당
CSS ( Cascading Style Sheets )
실제 화면에 표시되는 방법 ( 색상, 크기, 폰트, 레이아웃 등 )을 지정해 콘텐츠를 꾸며주는 시각적인 표현(정적)을 담당
JavaScript
콘텐츠를 바꾸고 움직이는 등 페이지를 동작시키는 동적 처리(논리)를 담당
HTML 실습
<!DOCTYPE html> : 문서의 html 버전을 지정
<html></html> : 문서의 전체 범위
<head></head> : 문서의 정보를 나타내는 범위
<body></body> : 문서의 구조를 나타내는 범위
<meta /> : html 문서의 제작자, 내용, 키워드 같은 여러 정보를 검색엔진이나 브라우저에 제공
<title></title> : html을 제목을 정의 ( 웹 브라우저 탭 부분에 표시 )
<link /> : 외부 문서를 가져와 연결할 때 사용 ( css 등등 )
<script></script> : jsp를 html문서 안에 작성하는 경우 사용
body의 구성요소
h 태그
ul 태그
a 태그
span 태그
br 태그
input 태그
주석
CSS
<!-- 선택자 { 속성:값; } -->
div {
color:red; <!-- 색상은 red -->
margin:20px; <!-- 외부여백 20px -->
}
- 속성 ex) color ...
- 값 ex) red ..
4주 차를 마치며.
정규표현식은 해도 해도 잘 모르겠다.. 계속 봐도 이해가 안감. 그렇지만 필수기 때문에 어쩔 수 없다
그리고 프로세스는 프로그램이 실행되는 순서에 대해서 정리했고,, 아직도 어렵다
html, css는 게시글 작성방법상 따로 내용 정리하기가 어려운 부분이 있어서 생략했다.
강의 속도가 점점 빨라지는데 생략되는 부분이 꽤 많은 거 같다 아무래도 인터넷 강의 특성상 어쩔 수 없는 거 같기도 하고
5주 차부터 장고를 배우게 되는데 강의를 신청한 이유이기도 하기 때문에 좀 더 열심히 들을 생각.