import re
password_checker = re.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,30}$"  )
mat = re.search(password_checker, password)

쓰는 것만 써서 이렇게 새로운 형태를 만나면 굳어버린다. 이 참에 연습할겸 분석을 했다. ref: Blog, COGNEX, Mozilla

  • ^: 행(라인)의 시작
  • $: 행의 가장 마지막을 의미
  • : and
  • \t: tab
  • \n: 줄 바꿈
  • .: 모든 문자를 의미
  • []: 대괄호 내의 모든 문자를 순서를 고려하지 않고 찾고자 한다.
    • e.g., [a-ZA-Z가-힣]
    • e.g., [^a-Z]: 알파벳 소문자를 제외하고 검색
  • *: 0번 이상의 문자
    • ‘*’ 앞에 오는 문자를 반복한다.
    • e.g., ‘bo*‘는 ‘b’도 되고 ‘booooo’도 된다.
  • ?: 물음표 앞에 오는 문자가 0 혹은 1개 존재함을 의미
  • x(?=y): lookahead라고 한다. 오직 y가 뒤따라오는 x에만 대응됨을 의미한다.
  • \d: 0-9와 동일. 숫자를 의미한다.

적용

import re
password_checker = re.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,30}$"  )
mat = re.search(password_checker, password)

위 정규표현식은 다음의 조건을 충족시키는 문자를 찾기 위한 것이다.

  • 8자리 이상 30글자 미만
  • 영어 대문자와 소문자 최소 1개씩 포함
  • 하나 이상의 숫자 포함
  • 하나 이상의 특수기호 (!@#$%^&*) 포함

조건 검사

(?=.[a-z])(?=.[A-Z])(?=.\d)(?=.[!@#$%^&*])은 이러한 조건들을 하나씩 체크하는 것이다. 즉, 4개의 조건 중 1개라도 거짓일 경우 4개의 그룹은 모두 거짓으로 계산될 것이다.

아래의 블로그 포스팅들을 보면 마치 AND 연산처럼 여러개의 조건을 이어붙인거라고 할 수 있다.

Leave a comment