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

실전 — 태그, 따옴표, 숫자

~12 min · practical, patterns

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

수량자를 결합한 실전 패턴

이제 수량자, 문자 클래스, 앵커, 그룹을 함께 쓸 수 있어. 서로 다른 문법을 어떤 경계로 묶는지 살펴보자.

느슨한 HTML/XML 태그 추출

<[^>]+><div><p class="foo">처럼 단순한 태그를 찾아. 실제 HTML을 해석할 때는 파서를 써야 하고, 이 패턴은 일회성 추출에만 적합해.

따옴표 문자열

"[^"]*"는 첫 닫는 따옴표에서 멈추도록 경계를 직접 표현해. 이스케이프된 따옴표까지 처리하려면 "(?:[^"\\]|\\.)*"처럼 백슬래시 이스케이프를 별도 대안으로 받아야 해. 패턴 전체의 안전성은 뒤에 이어지는 토큰까지 함께 판단해.

부호와 소수부가 선택적인 숫자

-?\d+(\.\d+)?는 선택적 마이너스, 하나 이상의 숫자, 선택적 소수부로 이루어져. 점과 뒤 숫자를 한 그룹으로 묶어야 소수부 전체가 함께 선택적으로 바뀌어.

수량자 확인 목록

  1. 바로 앞 조각이 필수라면 +, 선택적이라면 *가 맞는가?
  2. .*보다 경계를 직접 표현한 문자 클래스가 더 알맞은가?
  3. {n,m} 안에 불필요한 공백이 없는가?
  4. \b^...$처럼 필요한 경계를 붙였는가?
  5. 빈 입력과 아주 긴 입력으로도 시험했는가?

이 다섯 질문만 확인해도 흔한 수량자 버그 대부분을 걸러낼 수 있어.

Code

실서비스용 패턴 모음·python
import re

# 느슨한 HTML 태그
re.findall(r'<[^>]+>', '<p>hi</p> <a href="x">link</a>')
# ['<p>', '</p>', '<a href="x">', '</a>']

# 이스케이프를 지원하는 따옴표 문자열
pat = r'"(?:[^"\\]|\\.)*"'
re.findall(pat, '"simple" "with \\"escape\\" inside"')
# ['"simple"', '"with \\"escape\\" inside"']

# 숫자: 부호 있는 정수 또는 소수
for m in re.finditer(r'-?\d+(?:\.\d+)?', 'price -19.95 qty 7 ratio 0.5'):
    print(m.group())
# -19.95
# 7
# 0.5

External links

Exercise

실제 코드베이스에서 .*.+를 사용하는 패턴 하나를 골라 부정형 문자 클래스로 다시 작성해. 정상 입력과 실패 입력을 두 버전에 똑같이 대입해 결과가 같은지 확인하고, 긴 실패 입력에서는 실행 시간도 비교해. 바꾼 패턴이 언제 더 명확하고 안전한지 설명해.

Progress

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

댓글 0

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

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