Menu

파이썬 정규표현식 완벽 정리: re 모듈 사용법

파이썬 re 모듈로 문자열 검색부터 매칭, 그룹 캡처, 치환까지 — 실무에서 가장 자주 쓰는 정규식 패턴을 예제로 정리했습니다.

정규식을 써야 할 때

정규식(regex)은 텍스트 패턴을 기술하기 위한 작은 언어입니다. 강력한 만큼 남용하기 쉽다는 게 함정이죠.

re 모듈을 꺼내들기 전에, 평범한 문자열 메서드로 해결되는 일인지 먼저 따져보세요. .split(), .replace(), .startswith(), "target" in text 같은 것들은 같은 일을 하는 정규식보다 빠르고, 읽기 쉽고, 실수할 여지도 적습니다. 정규식은 찾으려는 대상이 구조는 있지만 고정된 문자열 연산으로는 표현하기 힘들 만큼 유연할 때 쓰는 겁니다. 이메일 주소, 전화번호, 형식이 정해진 로그 한 줄, HTML이나 Markdown 조각처럼 "이런 모양의 것을 찾고 싶다"는 검색이 딱 그런 경우죠.

기본 문법 정리

정규식 패턴 은 찾고자 하는 대상을 기술한 문자열입니다. 기본 재료는 다음과 같습니다.

  • . — 아무 문자 하나
  • \d — 숫자 하나 (0–9)
  • \w — "단어" 문자 하나 (알파벳, 숫자, 언더스코어)
  • \s — 공백 문자 하나
  • ^ — 문자열 시작
  • $ — 문자열 끝
  • [abc] — a, b, c 중 하나
  • [^abc] — a, b, c 를 제외한 아무 문자
  • a|b — a 또는 b
  • * — 앞 요소가 0번 이상
  • + — 1번 이상
  • ? — 0번 또는 1번
  • {3} — 정확히 3번
  • {2,5} — 2번에서 5번 사이
  • ( ... ) — 그룹 (내부 매칭 결과를 캡처)

실무에서 쓰는 정규식 대부분은 이 정도면 충분합니다.

핵심 함수들

re.search(pattern, text) 는 문자열 어디서든 첫 매치를 찾아줍니다. 매치 객체를 반환하고, 못 찾으면 None 을 돌려줍니다.

main.py
Output
Click Run to see the output here.

정규식 패턴을 작성할 때는 반드시 raw string(r"...")을 사용하세요. 그렇지 않으면 파이썬이 백슬래시를 문자열 이스케이프 문자로 해석해 버려서, 여러분이 의도한 것과 전혀 다른 패턴이 만들어집니다.

re.match(pattern, text)search와 비슷하지만, 문자열의 맨 앞에서만 매칭을 시도한다는 차이가 있습니다.

main.py
Output
Click Run to see the output here.

대부분의 경우에는 search를 사용하게 됩니다.

re.findall(pattern, text)는 겹치지 않는 모든 일치 결과를 리스트로 반환합니다:

main.py
Output
Click Run to see the output here.

findall은 매치 객체가 아니라 문자열을 반환한다는 점을 기억해 두세요. 그룹이 하나인 패턴이라면 그 그룹에 매칭된 내용이 돌아오고, 그룹이 여러 개라면 튜플로 묶인 리스트를 받게 됩니다.

캡처 그룹(capturing group) 사용하기

패턴 안에 소괄호로 묶인 부분은 거기에 매칭된 값을 그대로 캡처합니다:

main.py
Output
Click Run to see the output here.

이름 있는 그룹을 쓰면 훨씬 알아보기 쉽습니다:

main.py
Output
Click Run to see the output here.

정규식에 그룹이 두 개 이상 들어가면, 이름을 붙여두는 편이 값을 꺼내 쓰는 코드를 훨씬 읽기 좋게 만들어 줍니다.

re.sub으로 문자열 치환하기

re.sub(pattern, replacement, text)는 매칭되는 모든 부분을 치환합니다:

main.py
Output
Click Run to see the output here.

숫자가 아닌 문자는 전부 제거되죠. 치환 부분에서는 \1, \2처럼 캡처 그룹을 참조할 수 있습니다. raw 문자열에서는 \g<1> 형태가 더 명확합니다:

main.py
Output
Click Run to see the output here.

치환값 자리에 함수를 넘기는 것도 가능합니다. 단순히 문자열을 바꿔치기하는 수준을 넘어서는 변환을 할 때 유용하죠.

main.py
Output
Click Run to see the output here.

패턴을 컴파일해서 재사용하기

같은 패턴을 여러 번 사용한다면, 특히 반복문 안에서 쓴다면 한 번만 컴파일해두고 재사용하는 게 좋습니다:

main.py
Output
Click Run to see the output here.

컴파일된 패턴은 search, match, findall, sub 같은 메서드를 그대로 제공하는데, 이때는 패턴을 첫 번째 인자로 넘길 필요가 없습니다. 성능도 약간 좋고, 코드도 훨씬 깔끔해집니다.

플래그(flags)

자주 쓰는 옵션들은 flags= 인자로 넘기거나 | 연산자로 묶어서 함께 사용할 수 있습니다.

  • re.IGNORECASE (re.I) — 대소문자를 구분하지 않고 매칭합니다.
  • re.MULTILINE (re.M) — ^$가 문자열 전체의 시작/끝뿐 아니라 각 줄의 시작/끝에도 매칭됩니다.
  • re.DOTALL (re.S) — .이 줄바꿈 문자까지 매칭합니다. (기본값에서는 매칭하지 않습니다.)
  • re.VERBOSE (re.X) — 패턴 안에 공백과 # 주석을 사용할 수 있어서 가독성을 높일 수 있습니다.
main.py
Output
Click Run to see the output here.

re.VERBOSE는 복잡한 정규표현식 패턴을 다룰 때 특히 유용합니다:

main.py
Output
Click Run to see the output here.

여러 줄로 나누고 주석을 단 정규식은 한 줄짜리 난해한 패턴보다 유지보수가 훨씬 쉽습니다.

탐욕적 매칭 vs 게으른 매칭

수량자(*, +, ?, {n,})는 기본적으로 탐욕적(greedy) 이라 가능한 한 많이 매칭하려 듭니다. 뒤에 ?를 붙이면 게으른(lazy) 방식으로 바뀝니다:

main.py
Output
Click Run to see the output here.

탐욕적 매칭을 쓰면 <b>부터 </i>까지 문자열 전체를 한 번에 삼켜버립니다. 대부분의 경우 우리가 원하는 동작이 아니죠. 반면 게으른(lazy) .+?는 가장 먼저 만나는 >에서 멈춥니다.

(참고: 실제 서비스 코드에서 HTML을 정규식으로 파싱하는 건 절대 권장하지 않습니다. html.parser나 BeautifulSoup을 쓰세요. 위 예시는 어디까지나 탐욕적 매칭을 설명하기 위한 예일 뿐입니다.)

실전 예제

간단한 로그 포맷에서 한 줄씩 파싱해 보겠습니다:

main.py
Output
Click Run to see the output here.

코드 몇 줄 안 되는데 이 정도 위력이면 꽤 쏠쏠하죠.

몇 가지 습관

  • 패턴은 무조건 raw 문자열(r"...")로 작성하세요.
  • 처음엔 동작하는 가장 단순한 패턴으로 시작하고, 나중에 조여 나가세요.
  • 그룹이 두 개를 넘어가면 이름 있는 그룹(named group)을 쓰세요.
  • 재사용할 패턴은 미리 컴파일해두세요.
  • 정규식은 일반 문자열 메서드보다 느립니다. .split()으로 충분하다면 그냥 .split()을 쓰세요.

다음: 에러와 디버깅

이것으로 실전 데이터 투어 — 파일, JSON, CSV, HTTP, 날짜, 정규식 — 를 모두 둘러봤습니다. 그런데 실제 프로그램은 언젠가 반드시 에러를 만나게 되어 있고, 파이썬 트레이스백(traceback)을 제대로 읽어내는 능력은 디버깅에서 단연 가장 중요한 기술입니다. 마지막 장에서는 예외 처리와, 실무에서 가장 자주 마주치는 에러들을 다룹니다.

자주 묻는 질문

파이썬에서 정규표현식(regex)이 뭔가요?

정규표현식은 텍스트에서 특정 패턴을 찾기 위한 일종의 미니 언어입니다. 파이썬에서는 re 모듈을 통해 패턴을 검색하고, 원하는 부분만 뽑아내고, 매칭된 부분을 다른 문자열로 바꿀 수 있어요. 단순한 문자열 작업이라면 .split()이나 .replace() 같은 문자열 메서드만으로도 충분하니 그쪽을 먼저 고려하시고, 복잡한 구조의 패턴을 다뤄야 할 때 정규표현식을 꺼내 쓰는 게 좋습니다.

re.match와 re.search는 뭐가 다른가요?

re.match는 문자열의 맨 앞에서만 매칭을 시도합니다. 반면 re.search는 문자열 전체를 훑으면서 처음 나타나는 매칭을 찾아줘요. 애매할 땐 그냥 search를 쓰세요 — 우리가 흔히 기대하는 '문자열 안에서 패턴을 찾는다'는 감각에 훨씬 잘 맞습니다.

정규식 패턴은 항상 raw string(r-string)으로 써야 하나요?

네, 그렇게 쓰는 걸 권장합니다. 정규식 패턴에는 \d, \s, \b처럼 백슬래시가 자주 등장하는데, 일반 문자열에서는 파이썬이 이걸 이스케이프 문자로 해석해버리거든요. 앞에 r을 붙여서 r'\d+' 형태로 쓰면 문자열을 있는 그대로 전달하기 때문에, 정규식이 훨씬 깔끔하고 읽기 좋아집니다.

Coddy로 코딩 배우기

시작하기