C.W.K.
Stream
Lesson 03 of 12 · published

Backreference — \1, \2

~10 min · backreference, duplicate, engine

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

같은 패턴 안에서 캡처된 그룹 재사용

Backreference 는 "N번째 캡처 그룹이 매칭한 같은 텍스트 매칭" 의미. 문법: group 1 은 \1, group 2 는 \2 등.

고전 예시: 중복 단어 감지. 패턴 \b(\w+)\s+\1\b 는 "the the", "and and", "hello hello" 매칭 — 어떤 단어든 자기 자신이 따라옴.

패턴 재사용과 어떻게 다른가

Backreference \1 는 패턴을 반복하지 않음; 그룹이 매칭한 같은 텍스트 요구. 패턴 (\w+) \1 입력 "the cat": group 1 이 'the' 캡처, 그 다음 \1 이 리터럴 텍스트 'the' 따라오기 요구 — 안 따라옴 ('cat' 이 다음). 그래서 매칭 없음.

vs (\w+) (\w+) 는 "the cat" 매칭, \w+ 가 두 번 다 어떤 단어든 매칭하니까.

엔진 지원

Backreference 는 NFA-only 기능. Python re, JavaScript, PCRE, Java 다 지원. RE2/Go/ripgrep 미지원 — linear time 보장의 가격.

중복 외 사용

  • 균형 잡힌 따옴표/괄호 매칭: (['"]).+?\1 가 어느 따옴표 종류든 따옴표 문자열 매칭.
  • 반복 글자 run: (.)\1{2,} 가 같은 글자 3개 이상 매칭.
  • HTML 태그 쌍: <(\w+)>.+?</\1> 가 일치하는 open/close 태그 매칭 (실제로 HTML 이렇게 파싱하지 마).

Code

Backreference 패턴·python
import re

# 중복 단어 감지
re.findall(r'\b(\w+)\s+\1\b', 'the the cat sat sat by the river')
# ['the', 'sat']

# 3개 이상 반복 글자
re.findall(r'(.)\1{2,}', 'AAAAbbbcccccc')
# ['A', 'b', 'c']

# 따옴표 종류 매칭 — single 또는 double, 일관성
pattern = r'([\'"])([^\'"]+)\1'
re.findall(pattern, '"double" or \'single\' but not "mixed\'')
# [('"', 'double'), ("'", 'single')]  — "mixed\' 거부

# 태그 쌍 (loose)
re.findall(r'<(\w+)>([^<]*)</\1>', '<b>bold</b> <i>italic</b>')
# [('b', 'bold')]  — 두 번째 쌍 태그 미스매치

External links

Exercise

회문 3-글자 단어 (첫 글자와 마지막 글자 같음, 'eye', 'pop', 'mom' 같은) 찾는 정규식 작성. Backreference 사용. eye saw pop and mom but not lol 에 테스트.

Progress

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

댓글 0

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

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