C.W.K.
Stream
Lesson 07 of 10 · published

비밀번호 검증 패턴

~8 min · practical, password, stacked-lookahead

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

표준 다중 룰 예시

"비밀번호 8+ 글자, 소문자/대문자/숫자 각 하나 이상." Lookahead 없이는 악몽: 필수 글자가 등장할 모든 순서 enumerate.

Stack 된 lookahead 로 깨끗:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$

왼쪽에서 오른쪽:

  • ^ — 문자열 시작
  • (?=.*[a-z]) — 어딘가 앞에 소문자
  • (?=.*[A-Z]) — 어딘가 앞에 대문자
  • (?=.*\d) — 어딘가 앞에 숫자
  • .{8,} — 실제로 8+ 글자 소비
  • $ — 문자열 끝

세 lookahead 가 시작에서 돌아. 각각 앞을 엿봐서 어딘가 제약 존재 확인. 셋 다 통과 후 패턴이 8+ 글자 소비 진행.

왜 이게 교과서 예시

Lookaround 의 모든 중요한 거 시연:

  1. 같은 위치에 여러 제약 stack.
  2. 각 제약 독립 (순서 무관).
  3. 최종 소비가 제약과 별개.
  4. 결과가 거의 spec 처럼 읽힘.

룰 더 추가

특수 글자 하나 이상 필요? (?=.*[!@#$%^&*]) 추가. 공백 금지? (?!.*\s) (negative lookahead) 추가. 패턴이 linear 자라남, 지수적 아님.

Code

비밀번호 검증기·python
import re

# 8+ 글자, 소/대/숫자
weak = re.compile(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$')
bool(weak.match('Aa1aaaaa'))   # True
bool(weak.match('aaaaaaaaa'))  # False (대문자/숫자 없음)
bool(weak.match('Aa1'))        # False (너무 짧음)

# 강력: 12+ 글자, 소/대/숫자/특수, 공백 없음
strong = re.compile(
    r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])(?!.*\s).{12,}$'
)
bool(strong.match('Pippa@1234abc'))   # True
bool(strong.match('Pippa@1234'))      # False (10 글자만)
bool(strong.match('Pippa @1234abc'))  # False (공백)

# 가독 위해 VERBOSE 로 조립
password = re.compile(r'''
    ^                       # 시작
    (?=.*[a-z])             # 소문자 하나 이상
    (?=.*[A-Z])             # 대문자 하나 이상
    (?=.*\d)                # 숫자 하나 이상
    (?=.*[!@#$%^&*])        # 특수 하나 이상
    (?!.*\s)                # 공백 없음
    .{12,}                  # 총 12+ 글자
    $                       # 끝
''', re.VERBOSE)

External links

Exercise

Username 검증기 빌드: 4-20 글자, 문자로 시작 필수, 숫자 하나 이상, 하이픈 NO. Stack 된 lookahead 사용. 'pippa1', 'p1ppa', 'pippa', '1pippa', 'pippa-1' 테스트.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.