본문 바로가기
C.W.K.
Stream
Lesson 12 of 12 · published

정규식 퍼즐 — 숙련도 테스트

~15 min · puzzles, practice, graduation

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

다섯 퍼즐로 문법을 한 번에 묶어 봐

답을 바로 펼치지 말고 먼저 입력과 기대 결과를 직접 적어 봐. 패턴 후보를 만든 뒤 정상·실패·경계 입력을 통과시킨 다음 아래 풀이와 비교해.

퍼즐 1: 길이가 3~5인 회문

mom, eye, level, civic처럼 앞뒤가 같은 단어를 찾아. 단어 경계와 길이별 중심 구조를 함께 표현해야 해.

퍼즐 2: 앞에 buzz가 없는 fizz

buzzfizzbuzz fizzfizz는 건너뛰고, 홀로 나온 fizz만 찾아.

퍼즐 3: 모음이 정확히 두 개인 문자열

cat, beat, beats, beautiful 가운데 beatbeats만 성공해야 해.

퍼즐 4: ANSI 색 코드 제거

터미널 출력의 \x1b[31m, \x1b[1;32m 같은 제어 코드를 찾되 주변 글자는 그대로 남겨.

퍼즐 5: 나란히 반복된 단어

the the catsat sat에서 반복된 단어를 찾아 반환해.

풀이

1. \b(?:(\w)(\w)\1|(\w)(\w)\4\3|(\w)(\w)(\w)\6\5)\b는 길이 3, 4, 5를 별도 대안으로 두고 역참조로 좌우 대칭을 확인해. 실행 예시도 같은 패턴을 사용해.

2. (?<!buzz)(?<!buzz )\bfizz\b는 길이 4와 5인 앞 문맥을 고정 길이 후방 탐색 두 개로 나눠 Python 내장 re에서도 컴파일돼.

3. ^[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$는 모음 두 개 사이와 양끝을 비모음만 허용해.

4. \x1b\[[\d;]*m은 이스케이프 문자, 여는 대괄호, 숫자와 세미콜론, 마지막 m을 차례로 찾아.

5. \b(\w+)\s+\1\b은 첫 단어를 캡처한 뒤 역참조로 같은 단어가 다시 오는지 확인해.

정답보다 선택 이유를 설명할 수 있어야 해

퍼즐 1에서 길이마다 중심 구조가 왜 다른지, 퍼즐 2에서 후방 탐색을 왜 둘로 나눴는지 말할 수 있다면 문법을 외운 단계를 넘어선 거야. 전후방 탐색이 멋져 보여도 더 작은 문자 클래스나 캡처 그룹으로 풀 수 있는지 먼저 살펴보고, 실제 문제를 만족하는 가장 작은 도구를 골라.

Code

퍼즐 솔루션·python
import re

# 퍼즐 1: 3-5글자 회문
PALINDROME = re.compile(
    r'\b(?:(\w)(\w)\1|(\w)(\w)\4\3|(\w)(\w)(\w)\6\5)\b'
)
for m in PALINDROME.finditer('mom eye level civic noon racecar test'):
    print(m.group())
# mom
# eye
# level
# civic
# noon

# 퍼즐 2: 'buzz'가 붙거나 공백 하나를 두고 앞에 오는 'fizz' 제외
re.findall(r'(?<!buzz)(?<!buzz )\bfizz\b', 'buzz fizz solo fizz buzzfizz')
# ['fizz'] — solo 뒤의 독립 단어만 남음

# 퍼즐 3: 정확히 두 모음
TWO_VOWELS = re.compile(r'^[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$')
for word in ['cat', 'beat', 'beats', 'beautiful']:
    if TWO_VOWELS.fullmatch(word):
        print(word)
# beat
# beats

# 퍼즐 4: ANSI 코드 제거
ANSI = re.compile(r'\x1b\[[\d;]*m')
clean = ANSI.sub('', '\x1b[31mhello\x1b[0m \x1b[1;32mworld\x1b[0m')
print(clean)  # 'hello world'

# 퍼즐 5: 인접 중복 단어
DUPS = re.compile(r'\b(\w+)\s+\1\b')
for m in DUPS.finditer('the the cat sat sat by'):
    print(m.group(1))
# the
# sat

External links

Exercise

풀이를 보지 않고 다섯 퍼즐의 후보 패턴을 각각 작성해. 제공된 예시와 직접 만든 실패 입력으로 먼저 검증한 뒤 풀이와 비교하고, 틀린 문제는 어떤 경계를 놓쳤는지 적어.

Progress

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

댓글 0

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

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