본문 바로가기

코딩/머신러닝&데이터 분석 강의

[머신러닝 인강] 5-2주차: 클래스와 인스턴스, 정규표현식

<5-2주차 수강 클립>

01. Python Programming 기초

31. 클래스와 인스턴스 - 07. 클래스 연산자 재정의 이해 및 사용

32. 클래스와 인스턴스 - 08. 클래스 연습문제 풀이

33. 정규표현식 - 01. 정규표현식과 re모듈의 사용 - 1

 


 

이번에는 저번 주차에서 배운 '오버라이딩' 개념을

연산자에 적용시키는 법을 배운 주차였습니다

'연산자 오버라이딩(재정의)'을 통해 연산자를 커스텀하게 사용할 수 있어요!

>>수강 인증샷<<

 


 

31. 클래스와 인스턴스 - 07. 클래스 연산자 재정의 이해 및 사용

 

-(예제) 2차원 좌표 평면 상의 각 점 (x, y)를 나타내는 Point 클래스 정의하기

데이터: x좌표, y좌표

연산: 두 점 사이 덧셈, 뺄셈, 곱셈, 원점으로부터의 거리, (x, y)값 가져오기, 좌표 출력하기

 

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

: 생성자 함수로 멤버 데이터 초기화

 

    # + 연산자 오버라이딩
    def __add__(self, pt):
        new_x = self.x + pt.x
        new_y = self.y + pt.y
        #새로운 Point클래스의 객체 생성 후 리턴
        return Point(new_x, new_y)

: 덧셈 기능의 새로운 커스텀 함수가 아닌 파이썬 문법의 덧셈 연산자 '+' 를 오버라이딩 (*모든 연산자 또한 함수임)

 

    # - 연산자 오버라이딩
    def __sub__(self, pt):
        new_x = self.x - pt.x
        new_y = self.y - pt.y
        return Point(new_x, new_y)

: 뺄셈 연산자 '-' 를 사용자가 정의한 Point 객체 사이에서도 사용될 수 있도록 오버라이딩

 

    # * 연산자 오버라이딩
    def __mul__(self, factor):
        return Point(self.x * factor, self.y * factor)

: 곱셈 연산자 '*' 오버라이딩

 

    def __len__(self):
        return int((self.x**2 + self.y**2) ** (1/2))

: 입력 데이터의 길이를 반환하는 len() 빌트인 함수 오버라이딩

 

    # [] 연산자 오버라이딩
    def __getitem__(self, index):
        if index == 0:
            return self.x
        elif index == 1:
            return self.y
        else: #예외 처리 (원래는 오류 발생 시키기)
            return -1

: 인덱스처럼 Point 객체의 x를 0번째, y를 1번째 원소로 두고 아이템 가져오기

 

    def __str__(self):
        return '({}, {})'.format(self.x, self.y)

: print() 빌트인 함수 호출 시 (x, y) 형태로 호출하기 (*__str__함수 오버라이딩 하지 않을 경우 객체의 메모리 주솟값이 출력됨)

 

p1 = Point(3, 4)
p2 = Point(2, 7)

p3 = p1 + p2
p4 = p1 - p2
p5 = p1 * 3

print(p1)
print(p2)
print(p3)
print(p4)
print(p5)

print(len(p1))

print(p1[0]) #x좌표
print(p1[1]) #y좌표

 

-special method

__로 시작해서__로 끝나는 특수 함수

해당 메소드들을 구현(원래 있던 걸 오버라이딩)하면 사용자가 커스텀한 객체에 여러가지 파이썬 내장 함수나 연산자를 적용할 수 있음!

오버라이딩 가능한 함수 목록 참조:

 

3. Data model — Python 3.9.2 documentation

A class can implement certain operations that are invoked by special syntax (such as arithmetic operations or subscripting and slicing) by defining methods with special names. This is Python’s approach to operator overloading, allowing classes to define

docs.python.org

 


 

32. 클래스와 인스턴스 - 08. 클래스 연습문제 풀이

 

-복소수 클래스를 정의하기

  • 덧셈, 뺄셈, 곱셈 연산자 지원
  • 길이 (복소수의 크기) 지원
  • 복소수 출력 '1 + 4i'와 같이 표현
  • 비교 연산 ==, != 지원
  • =, <= , <, > 연산 지원
  • 절대값 지원

 


 

33. 정규표현식 - 01. 정규표현식과 re모듈의 사용 - 1

 

-정규표현식 (regular expression)

문자열 내에서 특정한 패턴을 '검색', '치환', '제거'하는 기능을 지원

정규표현식의 도움 없이 패턴을 찾는 작업(Rule 기반)은 불완전 하거나 작업의 비용이 높음

사용 예) 이메일 형식 판별, 전화번호 형식 판별, 숫자로만 이루어진 문자열, 웹페이지 크롤링 (특정 패턴의 문자열만 가져오고 싶을 때) etc...

 

-raw string

문자열 앞에 'r'이 붙으면 해당 문자열이 구성된 그대로 문자열로 변환 (back slash가 붙었을 때 escape 문자가 아닌 해당 문자 그대로 character의 역할을 함)

패턴의 경우 대부분 raw string으로 이루어짐! (특정 패턴의 경우 back slash와 함께 사용될 때가 있음)

a = 'abcdef\n' #escape 문자열 (특정 기능을 위해)
print(a)

b = r'abcdef\n' #raw string (문자열 앞에 r) -> 내가 정의한 그대로 문자열로 인식
print(b)

: 일반 string과 raw string 사이의 \(back slash) 차이

 

-기본 패턴

a, X, 9 등 문자 하나하나의 character들은 정확히 해당 문자와 일치! (몇몇 문자들_[], ., ^ etc 에 대해서는 예외가 존재)

  • . (마침표) - 어떤 한개의 character와 일치 (newline(엔터) 제외) _ '모든 문자들 중 아무거나 한 개' 의미
  • \w - 문자 character와 일치 [a-zA-Z0-9_]
  • \s - 공백문자와 일치 (탭, 스페이스...)
  • \t, \n, \r - tab, newline, return
  • \d - 숫자 character와 일치 [0-9]
  • ^ = 시작, $ = 끝 각각 문자열의 시작과 끝을 의미
  • \가 붙으면 스페셜한 의미가 없어짐. 예를들어 \.는 .자체를 의미 \\는 \를 의미
  • 자세한 내용은 링크 참조 https://docs.python.org/3/library/re.html
 

re — Regular expression operations — Python 3.9.2 documentation

This module provides regular expression matching operations similar to those found in Perl. Both patterns and strings to be searched can be Unicode strings (str) as well as 8-bit strings (bytes). However, Unicode strings and 8-bit strings cannot be mixed:

docs.python.org

 

- search method

첫 번째로 패턴을 찾으면 [re.Match] 객체를 반환 (패턴이 가장 먼저 나타나는 곳을 결과로 도출)

패턴을 찾지 못하면 [None] 반환

import re #모듈로 제공됨

#search(param1, param2)
#param1: 찾고자하는 정규표현식 패턴
#param2: 찾을 대상이 되는 문자열
    #param2 에서 param1 패턴을 찾음
    
m = re.search(r'abc', 'abcdef')

print(m.start()) #패턴이 검색된 시작 위치
print(m.end()) #패턴이 끝난 위치 (end 인덱스는 포함 x)
print(m.group()) #검색된 패턴 자체를 가져옴

: 패턴은 raw string이기 때문에 문자열('')앞에 'r' 붙이기!

 

m = re.search(r'abc', '123abcdef')

print(m.start()) #3
print(m.end()) #6 (3~6: 3, 4, 5)

#패턴 없는 경우
m = re.search(r'abc', '123abdef')

print(m) #None

: 패턴이 검출 되는 경우 & 검출 안되는 경우

 

# \d: 숫자 0-9 중 아무 숫자 한 개
    # \d\d: 숫자 두 개가 나란히 있는 패턴
re.search(r'\d\d', '112abcdef119')
# Out: <re.Match object; span=(0, 2), match='11'>

# \w: 아무 문자 character 한 개
    # \d\d\d\w: 숫자 세 개 + 문자(a-z, A-Z, 0-9) 한 개 있는 패턴
re.search(r'\d\d\d\w', '112abcdef119')
# Out: <re.Match object; span=(0, 4), match='112a'>

# .(마침표): 어떠한 문자와도 일치를 함
    # ..\w\w: 어떠한 문자 두 개 + 문자(a-z, A-Z, 0-9) 두 개
re.search(r'..\w\w', '@#$%ABCDabcd')
# Out: <re.Match object; span=(2, 6), match='$%AB'>

: 기본 패턴 사용 예제

 

-메타 캐릭터 (metacharacters)

[]: 문자들의 범위를 나타내기 위해 사용

  • [] 내부의 메타 캐릭터는 캐릭터 자체를 나타냄 (앞서 소개된 것처럼 특수한 의미를 갖는 게 아니라)
  • [abck] : a or b or c or k
  • [abc.^] : a or b or c or . or ^ (여기서 .과 ^는 특수한 의미 x)
  • [a-d] : -와 함께 사용되면 해당 문자 사이의 범위에 속하는 문자 중 하나
  • [0-9] : 모든 숫자
  • [a-z] : 모든 소문자
  • [A-Z] : 모든 대문자
  • [a-zA-Z0-9] : 모든 알파벳 문자 및 숫자
  • [^0-9] : ^가 맨 앞에 사용 되는 경우 해당 문자 패턴이 아닌 것(not의 의미)과 매칭
re.search(r'[cbm]at', 'cat')
# Out: <re.Match object; span=(0, 3), match='cat'>

re.search(r'[0-9]haha', '1haha')
# Out: <re.Match object; span=(0, 5), match='1haha'>

re.search(r'[0-4]haha', '7haha')
# Out: 검출 x

re.search(r'[abc.^]aron', '.aron')
# Out: <re.Match object; span=(0, 5), match='.aron'>

re.search(r'[^abc]aron', 'aaron') #[^abc]: a, b, c 가 '아닌' 모든 것들 중 하나
# Out: 검출 x

re.search(r'[^abc]aron', '#aron')
# Out: <re.Match object; span=(0, 5), match='#aron'>

: 메타 캐릭터 사용 예제

 


 

강의 링크: https://bit.ly/3cB3C8y

반응형