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

치환에서 그룹

~8 min · substitution, replacement, sed

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

치환 문자열에서 캡처한 값을 다시 꺼내 써

re.sub, sed, 정규식을 받는 문자열 치환 API는 매칭할 때 캡처한 그룹을 새 문자열의 재료로 사용할 수 있어. 도구마다 표기법이 다르니 같은 패턴을 옮길 때 특히 조심해야 해.

  • Python re.sub: \1, \2, 이름 그룹은 \g<name>
  • JavaScript replace: $1, $2, 이름 그룹은 $<name>
  • sed: \1, \2
  • ripgrep --replace: $1, $2, $name

캡처 순서를 바꿔 형식을 변환해

re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)2026-05-0405/04/2026로 바꿔. 같은 세 조각을 다시 찾을 필요 없이 치환 문자열에서 월, 일, 연도의 순서만 바꾼 거야.

전체 매칭도 그룹 0으로 참조할 수 있어

re.sub(r'\d+', r'[\g<0>]', text)는 찾은 숫자 전체를 대괄호로 감싸. Python에서는 \g<0>, JavaScript에서는 $&, sed에서는 &가 전체 매칭을 가리켜.

문자열만으로 부족하면 함수를 넘겨

Python의 re.sub(pattern, callable, text)처럼 일치 객체를 받아 새 문자열을 돌려주는 함수를 치환자로 쓸 수 있어. 대소문자 변환, 표 조회, 조건에 따른 재작성처럼 캡처 순서만 바꾸는 것으로는 부족한 작업을 이 방식으로 처리해.

Code

치환 패턴·python
import re

# 날짜 조각 재배열
re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', '2026-05-04 was today')
# '05/04/2026 was today'

# Named 치환
pattern = r'(?P<year>\d{4})-(?P<month>\d{2})'
re.sub(pattern, r'\g<month>/\g<year>', '2026-05')
# '05/2026'

# 전체 매칭으로 wrap
re.sub(r'\d+', r'[\g<0>]', 'order 1138 of 9999')
# 'order [1138] of [9999]'

# 치환에 함수 — 모든 매칭 대문자
re.sub(r'\b\w+\b', lambda m: m.group().upper(), 'hello world')
# 'HELLO WORLD'

# 로직 있는 함수
def shorten(m):
    n = int(m.group(1))
    return 'small' if n < 10 else 'large'
re.sub(r'(\d+)', shorten, 'order 5 and 50')
# 'order small and large'

External links

Exercise

날짜나 Last, First 형식의 이름처럼 재배열할 열이 있는 CSV 형태의 파일을 골라 re.sub 치환을 작성해. 먼저 복사본에 실행하고, 대상 열만 바뀌었는지와 다른 쉼표가 손상되지 않았는지 확인해.

Progress

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

댓글 0

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

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