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

긍정형 후방 탐색 — (?<=...)

~8 min · lookbehind, positive

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

후방 탐색은 바로 앞 문맥만 확인해

(?<=...)는 현재 위치 앞쪽의 문자가 조건과 맞는지 검사하지만 그 문자를 매칭 결과에는 넣지 않아. 접두사는 조건으로만 쓰고 뒤의 값만 꺼내고 싶을 때 유용해.

표식 뒤의 값만 추출해 봐

(?<=\$)\d+(\.\d+)?는 달러 기호가 바로 앞에 있는 숫자를 찾아. $19.99에서 결과는 19.99이고 $는 포함되지 않아. 같은 방식으로 user_ 뒤의 식별자나 on 뒤의 날짜만 꺼낼 수 있어.

후방 탐색의 길이 규칙은 엔진마다 크게 달라

  • Python 내장 re: 고정 길이만 허용해. 길이가 달라지는 대안이나 수량자가 들어가면 컴파일 오류가 날 수 있어.
  • Python regex와 .NET: 가변 길이 후방 탐색을 지원해.
  • Java: 최대 길이를 계산할 수 있는 일부 가변 길이를 지원하지만 버전별 동작을 확인해야 해.
  • PCRE2: 10.42 이하에서는 각 대안이 고정 길이여야 하고, 10.43부터는 설정된 한도 안에서 제한적인 가변 길이를 지원해.
  • JavaScript: ES2018부터 후방 탐색을 지원하고 비고정 길이 형태도 정의하지만 실제 대상 런타임의 지원 여부를 확인해야 해.
  • RE2와 Go: 후방 탐색을 지원하지 않아.

후방 탐색은 같은 문법처럼 보여도 이식성이 크게 갈리는 기능이야. 패턴을 정하기 전에 실행할 엔진과 버전부터 확인해.

Code

후방 탐색 패턴·python
import re

# '$' 뒤 가격 추출
re.findall(r'(?<=\$)\d+(?:\.\d+)?', 'paid $19.99 not 20 but $5')
# ['19.99', '5']

# 'user_' 뒤 ID 추출
re.findall(r'(?<=user_)\w+', 'user_alice signed in, user_bob too')
# ['alice', 'bob']

# 'on ' 뒤 날짜 (fixed-width 패턴으로)
re.findall(r'(?<=on )\d{4}-\d{2}-\d{2}', 'logged on 2026-05-04 received')
# ['2026-05-04']

# Variable-width — Python 의 third-party 'regex' 모듈에서 동작
# import regex
# regex.findall(r'(?<=cat|elephant) sat', 'the cat sat the elephant sat')
# ['sat', 'sat']  — 동작

# Python 내장 're' 에선 에러 또는 의외 동작 가능

External links

Exercise

Apache 로그에서 GET 바로 뒤에 오는 URL 경로만 추출하는 후방 탐색 패턴을 작성해. 샘플 로그 여러 줄에 적용해서 요청 메서드와 공백은 제외되고 경로만 반환되는지 확인해.

Progress

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

댓글 0

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

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