본문 바로가기
패스트캠퍼스

[패스트캠퍼스] 강의 4주차 / 정규표현식, 프로세스 , Html, CSS

by 리잼 2022. 9. 17.
반응형

정규표현식

장점

  • 문자열 추출, 유효성 검사에서 유용하게 쓰임
  • 거의 모든언어에서 지원

단점

  • 가독성이 좋지 못함
  • 유지보수가 힘듦

정규표현식 연습 사이트

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 실습

html 기본 셋팅

<!DOCTYPE html> : 문서의 html 버전을 지정

<html></html> : 문서의 전체 범위

<head></head> : 문서의 정보를 나타내는 범위

<body></body> : 문서의 구조를 나타내는 범위

<meta /> : html 문서의 제작자, 내용, 키워드 같은 여러 정보를 검색엔진이나 브라우저에 제공

<title></title> : html을 제목을 정의 ( 웹 브라우저 탭 부분에 표시 )

<link /> : 외부 문서를 가져와 연결할 때 사용 ( css 등등 )

<script></script> : jsp를 html문서 안에 작성하는 경우 사용

 

body의 구성요소

h 태그

제목 요소는 숫자가 작을수록 강조된다

ul 태그

li는 목록내 각 항목이다

a 태그

다른/같은 페이지로 이동하는 하이퍼링크를 지정하는 요소

span 태그

레이아웃을 구분하는데 사용되는 span

br 태그

줄바꿈을 할때 사용되는 태그

input 태그

사용자가 데이터를 입력하는 요소

주석

주석태그는 브라우저가 해석을 하지않아 내용이 표시되지 않는다

CSS

<!-- 선택자 { 속성:값; } -->

div {
	color:red; <!-- 색상은 red -->
    margin:20px; <!-- 외부여백 20px -->
    }
  • 속성 ex) color ...
  • 값 ex) red ..

main.css 파일 생성
html 파일에 link로 main.css 설정
출력결과

4주 차를 마치며.

정규표현식은 해도 해도 잘 모르겠다.. 계속 봐도 이해가 안감. 그렇지만 필수기 때문에 어쩔 수 없다

그리고 프로세스는 프로그램이 실행되는 순서에 대해서 정리했고,, 아직도 어렵다

html, css는 게시글 작성방법상 따로 내용 정리하기가 어려운 부분이 있어서 생략했다.

강의 속도가 점점 빨라지는데 생략되는 부분이 꽤 많은 거 같다 아무래도 인터넷 강의 특성상 어쩔 수 없는 거 같기도 하고

5주 차부터 장고를 배우게 되는데 강의를 신청한 이유이기도 하기 때문에 좀 더 열심히 들을 생각.

 

반응형