본문 바로가기
프로그래밍/Python

[AI 부트캠프] DAY 13 - 파이썬 7

by HOHHOH 2023. 8. 3.

[오늘의 일지]

파이썬 익숙해지기 - 정규표현식, re모듈의 메서드(match 객체의 메서드), 실습 위주의 복습하기(클래스)

[상세 내용]

파이썬 익숙해지기

정규표현식

- 정규표현식 정의 : 정규표현식(regular expression)은 문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴입니다. 이러한 검색 패턴은 모든 종류의 문자열 검색이나 교체 등의 작업에서 사용할 수 있습니다.

- 정규표현식 사용방법

Character classes
. any character except newline
\w\d\s word, digit, whitespace
\W\D\S not word, digit, whitespace
[abc] any of a, b, or c
[^abc] not a, b, or c
[a-g] character between a & g
Anchors
^abc$ start / end of the string
\b\B word, not-word boundary
Escaped characters
\.\*\\ escaped special characters
\t\n\r tab, linefeed, carriage return
Groups & Lookaround
(abc) capture group
\1 backreference to group #1
(?:abc) non-capturing group
(?=abc) positive lookahead
(?!abc) negative lookahead
Quantifiers & Alternation
a*a+a? 0 or more, 1 or more, 0 or 1
a{5}a{2,} exactly five, two or more
a{1,3} between one & three
a+?a{2,}? match as few as possible
ab|cd match ab or cd
 

- 그냥 정규표현식만 봐서는 이해하기 어렵기 때문에 연습할 수 있는 사이트 링크를 남겨두겠습니다.

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

 

re모듈의 메서드(match 객체의 메서드)

- re모듈의 메서드 : 파이썬에서 정규표현식을 사용하기 위한 기본 라이브러리

- re모듈 내장 함수 

종류 기능 찾는 경우 없는경우
match() 문자열 처음부터 검색 match object 1 None
search() 문자열 전체를 검색 match object 1 None
findall() 문자열 전체를 검색 문자열 리스트 빈 리스트
finditer() 문자열 전체를 검색 match object iterator None
fullmatch() 패턴과 문자열에 남는 부분 없이 완벽하게 일치 match object 1 None

- re모듈 예시

import re

#  re 모듈의 메서드

str = 'love people around you, love your work, love yourself'

# 1) match : 문자열의 처음부터 검색 (결과 : 1개의 match 객체)
result = re.match('love', str)
print(result)

# 2) search : 문자열의 전체를 검색 (결과 : 1개의 match 객체)
result = re.search('people', str)
print(result)

# 3) findall : 문자열의 전체를 검색 (결과 : 문자열 리스트)
results = re.findall('love', str)
print(results)

# 4) finditer : 문자열의 전체를 검색 (결과 : match 객체 이터레이터)
results = re.finditer('love', str)
print(results)

for result in results:
    print(result)

# 5) fullmatch 패턴과 문자열이 완벽하게 일치하는지 검사
str2 = 'Hey Guys, read books'
result = re.fullmatch('.*', str2)
print(result)

>>>
<re.Match object; span=(0, 4), match='love'>
<re.Match object; span=(5, 11), match='people'>
['love', 'love', 'love']
<callable_iterator object at 0x000001B6617B7100>
<re.Match object; span=(0, 4), match='love'>
<re.Match object; span=(24, 28), match='love'>
<re.Match object; span=(40, 44), match='love'>
<re.Match object; span=(0, 20), match='Hey Guys, read books'>
 
- match의 내장 함수
종류 기능 ex)
group() 매칭된 문자열을 반환 people
start() 매칭된 문자열의 시작위치 5
end() 매칭된 무자열의 끝 위치 11
span() 매칭된 문자열의 (시작,) 튜플 (5, 11)
- match 객체의 메서드 예시
str = 'love people around you, love your work, love yourself'

#  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())
>>>
people
5
11
(5, 11)

 

 

- re 모듈 전화번호 예시로 연습

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)
>>>
3333
1. 7888
2. 1234
3. 5678
4. 9999
5. 2222
010-2343-****

 

지난 ATM 시스템 연습문제를 클래시화 하는 과정에서 계좌금액이 초기화되는 현상 드디어 해결

- 지난 DAY 11 - 파이썬 5 글의 마지막쯤에 썼던 내용에서 강의 마지막 과제였던 ATM 시스템 연습문제를 클래스화 하는 과정에서 계좌금액이 초기화되는 현상 때문에 실패했다고 했었는데 여러 가지 방법을 찾아보고 모색하던 중에 드디어 해결했습니다. 지난 글은 아래에 링크해 두겠습니다.

 

[AI 부트캠프] DAY 11 - 파이썬 5

[오늘의 일지] 파이썬 온라인 실시간 강의 - 반복문부터 클래스까지의 내용 [상세 내용] 파이썬 기본 내용 및 실습 반복문 - try, except(오류처리 혹은 예외처리) : try, except 구문은 오류 발생가능성

odds-endz.com

지난번에 만들었던 코드에서 self.account 부분이 분명 문제를 가지고 있는 거 같았는데 어떻게 풀어 나가야 하는지 답답했던 중에 구글에 검색 내용에서 클래스 내부에 선언된 변수를 클래스 변수라고 하며, self.account과 같이 self가 붙어 있는 변수를 인스턴스 변수라고 하는 글을 발견했습니다. 자세한 내용은 이해하지 못했지만 클래스 내 함수를 호출할 때는 클래스 변수를 사용해야 초기화되는 현상을 해결할 수 있었습니다. 

 

- 기존에 저장하던 인스턴스 변수 방식

# 기존에 저장하던 인스턴스 변수 방식
class ATM:
    def __init__(self):
        
        self.account = 0

 

- 이번에 해결한 클래스 변수 방식

# 이번에 해답을 찾은 클래스 변수 방식
class ATM:
    account = 0
    def __init__(self):
        pass

 

- 그렇게 완성된 최종 ATM 시스템 연습문제를 클래스화 한 내용

# ATM 클래스화 

class ATM:
    account = 0
    def __init__(self):
        pass
  
    # menu
    def menu(self):
        while True:
            
            msg = '''
                -------------------------------------------------------------
                안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
                1. 입금
                2. 출금
                3. 잔액확인
                4. 종료
                -------------------------------------------------------------
                '''
            print(msg)
            
            menu_1 = input('원하시는 서비스 메뉴를 숫자로 입력 해주세요. : ')
            
            if menu_1 == '1':
                ATM().deposit()
            elif menu_1 == '2':
                ATM().withdrawal()
            elif menu_1 == '3':
                ATM().Balance()
            elif menu_1 == '4':
                return print('이용해 주셔서 감사합니다.')
            else :
                print('서비스 입력이 잘못 되었습니다. 숫자만 입력해주세요')
                pass


    # 입금
    def deposit(self):
        try:
            num = int(input('입금하실 금액을 적어주세요. : '))
            ATM.account += num
            print(f'귀하의 현재 잔액은 {ATM.account}입니다.')
        except ValueError:
            print('서비스 입력이 잘못 되었습니다. 금액만 입력해주세요. 시작 메뉴로 돌아갑니다.')
            pass 
       
    # 출금 
    def withdrawal(self):
        try:
            num = int(input('출금하실 금액을 적어주세요. : '))
            if ATM.account >= num:
                ATM.account -= num
                print(f'귀하의 현재 잔액은 {ATM.account}입니다.')
            else:
                print('잔액이 부족합니다.')
        except ValueError:
            print('서비스 입력이 잘못 되었습니다. 금액만 입력해주세요. 시작 메뉴로 돌아갑니다.')
            pass
       
    # 잔액확인
    def Balance(self):
        print(f"현재 잔액은 {ATM.account}입니다.")

 

- 위에 ATM 시스템 연습문제를 클래스화 한 코드를 실행한 결과 ( 결과적으로 적용시킨 내용은 처음 메뉴에서 숫자 외에 문자나 메뉴에 있지 않은 숫자를 입력 시 처음 메뉴로 넘어가는 하는 설정과 입출금 시 문자를 사용해도 다시 처음 메뉴로 넘어가게 하는 설정까지 추가했습니다.)

# 실행 결과
ATM().menu()
>>>
                -------------------------------------------------------------
                안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
                1. 입금
                2. 출금
                3. 잔액확인
                4. 종료
                -------------------------------------------------------------
                
원하시는 서비스 메뉴를 숫자로 입력 해주세요. : 입금
서비스 입력이 잘못 되었습니다. 숫자만 입력해주세요

                -------------------------------------------------------------
                안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
                1. 입금
                2. 출금
                3. 잔액확인
                4. 종료
                -------------------------------------------------------------
                
원하시는 서비스 메뉴를 숫자로 입력 해주세요. : 3
현재 잔액은 0입니다.

                -------------------------------------------------------------
                안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
                1. 입금
                2. 출금
                3. 잔액확인
                4. 종료
                -------------------------------------------------------------
                
원하시는 서비스 메뉴를 숫자로 입력 해주세요. : 1
입금하실 금액을 적어주세요. : 12000
귀하의 현재 잔액은 12000입니다.

                -------------------------------------------------------------
                안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
                1. 입금
                2. 출금
                3. 잔액확인
                4. 종료
                -------------------------------------------------------------
                
원하시는 서비스 메뉴를 숫자로 입력 해주세요. : 2
출금하실 금액을 적어주세요. : aaaaa
서비스 입력이 잘못 되었습니다. 금액만 입력해주세요. 시작 메뉴로 돌아갑니다.

                -------------------------------------------------------------
                안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
                1. 입금
                2. 출금
                3. 잔액확인
                4. 종료
                -------------------------------------------------------------
                
원하시는 서비스 메뉴를 숫자로 입력 해주세요. : 2
출금하실 금액을 적어주세요. : 2000
귀하의 현재 잔액은 10000입니다.

                -------------------------------------------------------------
                안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
                1. 입금
                2. 출금
                3. 잔액확인
                4. 종료
                -------------------------------------------------------------
                
원하시는 서비스 메뉴를 숫자로 입력 해주세요. : 4
이용해 주셔서 감사합니다.

 

[마무리]

 오늘은 녹화 강의에서 파이썬 기초의 최종 미니 프로젝트 수업을 들었습니다. 파이썬 기초에서 배운 문법을 가지고 블로그 형식을 만드는 내용이었는데 직접 만드는데 아직까지는 어려운 부분이 많아서 강사님이 만드는 것을 일단 보는 것으로 마무리했습니다. 그리고 선택 강의에 있는 조금 기초적이지 않은 내용을 듣고 정리해 보았습니다. 마지막으로 지난 시간에 해결하지 못했던 클래스화의 문제를 해결했습니다. 혼자서 문제를 해결하는 과정에서 약간의 희열감 같은 것을 느꼈을 만큼 기분 좋은 하루였습니다.

 

반응형

댓글