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

역참조 — \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

캡처한 텍스트를 같은 패턴에서 다시 쓰기

역참조는 N번째 캡처 그룹이 실제로 잡은 텍스트와 똑같은 값을 요구해. 그룹 1은 \1, 그룹 2는 \2처럼 참조해.

\b(\w+)\s+\1\bthe the, and and처럼 같은 단어가 연달아 나온 곳을 찾아. 첫 그룹이 어떤 단어를 잡든 뒤의 \1은 바로 그 단어와 같아야 해.

패턴을 한 번 더 쓰는 것과 달라

(\w+) \1은 두 번째 단어도 첫 번째 단어와 같아야 하므로 the cat에는 매칭하지 않아. 반면 (\w+) (\w+)는 두 그룹이 서로 다른 단어를 잡아도 되므로 매칭해.

엔진 지원

Python re, JavaScript, PCRE, Java처럼 백트래킹하는 엔진은 역참조를 지원해. RE2와 Go, ripgrep 기본 엔진은 선형 시간 보장을 위해 지원하지 않고, ripgrep에서는 --pcre2를 켜야 사용할 수 있어.

중복 단어 말고도 쓸 수 있어

  • (['"]).+?\1로 같은 종류의 따옴표가 여닫히는지 확인해.
  • (.)\1{2,}로 같은 문자가 세 번 이상 이어진 구간을 찾아.
  • <(\w+)>.+?</\1>로 같은 이름의 단순 태그 쌍을 찾을 수 있지만 실제 HTML 해석에는 파서를 써.

Code

역참조 패턴·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

첫 글자와 마지막 글자가 같은 세 글자 단어를 찾도록 역참조 패턴을 작성해. eye saw pop and mom but not cat에 적용해서 세 회문만 매칭되는지 확인해.

Progress

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

댓글 0

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

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