python

[python] 파이썬 클래스 실습 및 정규식예제

vhxpffltm 2019. 8. 26. 22:29

모듈 만들기

3개의 모듈을 만들어 보자. 여기서는 정규식을 이용해서 이메일과 비밀번호를 체크하는 간단한 프로그램을 만들어 볼것이다.

 

user_pwd.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import re
#정규식을 사용하기
 
def password_val_chk(pwd):
    pass #아무 일도 하지 않는 구문,
    if len(pwd) < 6 or len(pwd) > 12:
        print(pwd, '의 길이가 이상합니다.')
        return False
 
    #for c in pwd:
        #if not c.isnumeric() and not c.isalpha():
            #print(pwd, '숫자와 영문자로만 구성되지 않음..')
            #return False
    if re.findall('[a-zA-Z0-9]+',pwd)[0!= pwd:
        print(pwd, '숫자와 영문자로만 구성되지 않음..')
        return False
    #findall()함수의 반환값의 첫 번째 항목값이 pwd와 같은지 확인, 소문자,대문자,숫자를 연속해서 찾는 패턴임
    #이 함수에서 반환한 리스트의 첫 항목이 pwd값과 일치하는지 확인한다. 얘는 반환이 lsit다
    '''
    upper = False
    lower = False
 
    for i in pwd:
        if upper and lower: break
        if i.isalpha():
            if not upper:
                upper = i.isupper()
            if not lower:
                lower = i.islower()
    if not upper or not lower:
        print(pwd, '영문 대문자와 소문자가 함꼐 존재하지 않음...')
        return False
    '''
    if len(re.findall('[a-z]',pwd)) == 0 or len(re.findall('[A-Z]',pwd)) == 0:
        print(pwd, '영문 대문자와 소문자가 함꼐 존재하지 않음...')
        return False
 
    print(pwd, '는 알맞는 비번입니다.')
    return True
 
if __name__ == '__main__':  #이 파일을 직접 실행할때!! (테스트용), 해당 함수를 외부에서 바로 호출할 때나
                            #다른 파이썬 파일이에서 호출하지 않고 해당파일을 직접 실행하는 경우에 블록문 실행
    password_val_chk('23jke')
    password_val_chk('432kdm123')
    password_val_chk('200j@9k_90')
    password_val_chk('3klQLe392')
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

주석부분은 정규식을 사용하지 않았을 때 일일이 대소문자를 구분하고 있다. 하지만 정규식을 사용해보자.

 

정규식은 import re 로 모듈을 임포트하고 findall() 함수로 패턴은 소문자(a-z), 대문자(A-Z), 숫자(0-9)를 연속해서(+) 찾는 패턴이다. 이 findall()에 대한 사용법과 내용은 래퍼런스를 참고하면 좋을 것 같다.

 

아래의 if len(~~~) 도 같다. 영문 대문자와 소문자가 함께 존재하지 않는것을 찾고 있다.

 

이번에는 이메일에 대한 코드를 살펴보자.

 

user_email.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re
 
def email_val_chk(email):
    if re.findall(r'[\w.-]+@[\w.-]+.\w+',email)[0!= email:
        print('이메일 형식이 맞지 않습ㄴㅣ다')
        return False
    #raw포맷으로 문자를 인식하겠다는 뜻, 정규식에 역 슬래시가 있는 패턴을 사용하기위해 r을 붙임
    #[\W.-]+ 는 영문 대소문자와 언더바, 점, 빼기 기호를 연속으로 찾는다.
    print(email,' <---형식에 맞음')
    return True
 
if __name__ == '__main__':
    email_val_chk('#@c#o@gmail*on')
    email_val_chk('vhxpffltm@naver.com')
 

 

이 코드도 정규식을 사용하였다. 어떤 내용인지만 살펴보자. 첫 번째 인자에 'r' 문자는 앞으로 나올 문자열에 파이썬 문자열 특수 기호를 인식하지 않고 raw 포맷으로 인식하겠다는 뜻이다. 정규식에 역 슬래쉬(\) 기호가 들어가 있는 패턴을 사용하려면 이 'r'을 붙이도록 하자.

 

@ 앞까지 보면 [\w.-]+는 영문 대소문자와 언더 바(_), 점 기호, 빼기 기호(-)를 연속으로 찾고 있다. 즉, @까지 해당 기호들을 찾고 @를 찾은 다음 이전과 같은 패턴을 연속으로 찾고 점 기호(.) 를 찾는 이메일의 조건을 찾고 있는 것이다.

 

사용자 클래스 만들기

사용자로부터 입력 받은 이메일과 비번은 같은 사용자로 묶여 있다. 이 필드를 가지고 있는 클래스를 만들어본다. 그리고 위의 이메일과 비번 체크파일을 가지고 올바른지 확인해 본다.

user_manage.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import user_email as ue
import user_pwd as upr
 
class User:
    def __init__(self,email,pwd): #초기화 함수 재정의
        self.email = email
        self.pwd = pwd    #인스턴스 변수 생성, 유효범위는 인스턴스 내부이다.
        self.check_val()  #입력한 이메일 주소 및 비번 검증
 
    def check_val(self):
        ue.email_val_chk(self.email)
        upr.password_val_chk(self.pwd)
        #인자값으로 인스턴스 변수가 들어간다.
 
if __name__ == '__main__':
    user01 = User('ghdrlfehd@naver.com','ghdrlfehd123')
    user02 = User('rlfehd1$.c@gmail.com','rlfehdA')
    #객체 생성,
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

아까 만든 두 모듈을 탑재한다. 그리고 User 라는 클래스를 선언하였다. 

초기화 함수를 재정의하여 두 개의 인자 값을 추가로 받아 User 인스턴스 변수로 만들었다. 그리고 클래스 내부함수를 호출한다.

클래스의 내부함수를 선언하여 이전에 구현한 두 도뮬의 함수를 호출한다. 이 파일을 직접 실행하여 User 클래스의 인스턴스를 만들어서 2개의 인자를 가지는 이메일과 비번을 user01변수에 넣어 확인해보자.

이것이 유효한 이메일과 비번인지 확인할 수 있다.

 

이것으로 정규식에 대해 간단하게 살펴보고 직접 사용자 클래스를 만들어 어떻게 이루어지고 동작했는지 확인하였다. 이것으로 클래스에 대해 이해가 잘 되었다고 생각한다.

 

두 인스턴스 변수에 대한 결과는 아래와 같다.