![[개발 도구 01] 정규식 - 정규식이 뭐고 왜 쓰나요](https://img.thenullpage.com/posts/8222/8222_1_acc191.webp)
이메일 형식만 딱 검증하는 코드를 짜야 했던 적 있으신가요, 아니면 로그 파일 수만 줄 사이에서 아이피 주소만 뽑아내야 했던 경험은요. 회원가입 폼에서 전화번호 형식을 확인하는 것도, 문서 더미에서 날짜만 골라내는 것도 다 비슷한 고민이에요. 이럴 때 없으면 답답한 도구가 하나 있는데요, 바로 정규식이에요. 오늘은 정규식이 정확히 뭐고, 왜 그렇게 배우라고들 하는지 처음부터 풀어볼게요.
01.1 정규식이 도대체 뭔가요?
정규식은 영어로 리귤러 익스프레션(regular expression)이라고 하고, 개발자들은 줄여서 regex라고 많이 불러요. 한마디로 말하면 문자열의 패턴을 표현하는 작은 전용 언어예요. 파이썬이나 자바스크립트 같은 범용 프로그래밍 언어랑은 성격이 다른데, 정규식은 딱 한 가지 일, 그러니까 이 문자열이 이런 모양을 하고 있는지 확인하고 필요하면 그 부분만 뽑아내거나 바꾸는 일만 전문으로 해요.
예를 하나 들어볼게요. 2026-07-21이라는 문자열이 진짜 날짜 형식인지 확인하고 싶다고 해봐요. 숫자 4개, 하이픈, 숫자 2개, 하이픈, 숫자 2개라는 규칙이 눈에 보이잖아요. 이걸 정규식으로 쓰면 \d{4}-\d{2}-\d{2} 이렇게 표현할 수 있어요. 여기서 \d는 숫자 한 글자라는 뜻이고, {4}는 바로 앞에 있는 걸 네 번 반복하라는 뜻이에요. 아직은 암호처럼 보여도 괜찮아요, 메타문자랑 수량자 개념은 차차 손에 붙게 되실 거예요.
정규식이 재밌는 건, 이게 특정 프로그래밍 언어의 전유물이 아니라는 점이에요. 파이썬 re 모듈에서도, 자바스크립트 정규식 리터럴에서도, 터미널에서 쓰는 grep이나 sed에서도 거의 똑같은 문법을 써요. 한 번 제대로 배워두면 언어를 바꿔도, 도구를 바꿔도 그대로 써먹을 수 있는 거예요.
처음 정규식을 보면 \d, \w, {4} 같은 기호들이 암호문처럼 느껴져서 지레 겁먹는 분들이 많아요. 근데 하나씩 뜯어보면 규칙은 몇 개 안 돼요. 알파벳 몇 개랑 특수문자 몇 개가 반복해서 조합되는 것뿐이라서, 처음 며칠만 적응하고 나면 그다음부터는 오히려 코드보다 훨씬 빨리 읽히는 경우도 많아요.
01.2 왜 이렇게까지 배워야 하나요?
사실 정규식 없이도 문자열 다루는 기본 함수들, 그러니까 startswith, split, in 연산자 같은 걸로 어지간한 문제는 처리할 수 있어요. 근데 조건이 조금만 복잡해지는 순간부터 정규식이 압도적으로 편해져요.
실전 예시를 들어볼게요. 서버 로그 파일 안에서 아이피 주소만 전부 뽑아내야 한다고 해봐요. 로그 한 줄이 이렇게 생겼다고 할게요, 2026-07-21 14:32:01 접속 192.168.0.15 요청 성공. 이 안에서 192.168.0.15만 골라내려면 정규식이 딱이에요.
import re
로그 = "2026-07-21 14:32:01 접속 192.168.0.15 요청 성공"
re.findall(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", 로그)
결과: ['192.168.0.15']
이 한 줄이면 로그 파일이 만 줄이든 십만 줄이든 아이피 주소만 쫙 뽑아낼 수 있어요. 정규식 없이 이걸 직접 짜려고 하면, 문자 하나씩 확인하면서 숫자인지 점인지 검사하는 코드를 손으로 짜야 하는데, 코드도 훨씬 길어지고 버그도 나기 쉬워요. 이렇게 검증, 추출, 치환이라는 세 가지 일을 짧은 코드로 처리해주는 게 정규식을 배워야 하는 진짜 이유예요.
정규식이 진가를 발휘하는 순간은 이런 반복 작업을 자동화할 때예요. 예를 들어 게시판 스팸 필터를 만든다고 해보면, 도배성 글에 자주 등장하는 전화번호나 링크 패턴을 미리 정규식으로 정의해두고, 새 글이 올라올 때마다 그 패턴에 걸리는지 검사하는 식으로 쓸 수 있어요. 사람이 눈으로 하나하나 확인하던 일을 코드 몇 줄이 대신해주는 거죠.
01.3 정규식이 못 하는 것도 있다면서요?
정규식이 만능처럼 느껴질 수 있는데, 사실 정규식이 못 하는 것도 분명히 있어요. 초보자들이 자주 하는 실수 중 하나가 바로 정규식으로 HTML이나 JSON처럼 중첩 구조를 통째로 파싱하려는 시도예요.
왜 안 되냐면, 정규식은 이론적으로 정규 언어라는 범주에 속하는데, 이 정규 언어라는 게 괄호나 태그처럼 열고 닫는 짝을 세는 능력이 없어요. 태그가 여러 겹으로 겹쳐 있는 문서에서 정규식으로 특정 태그의 시작과 끝을 정확히 짝지으려고 하면 금방 한계에 부딪혀요.
실제로 겪기 쉬운 함정 하나를 보여드릴게요. <b>안녕</b> 반가워요 <i>오늘도</i>라는 문자열에서 <.*>라는 패턴으로 태그만 지우려고 하면, 원래는 <b>, </b>, <i>, </i> 이 네 개 태그만 지워지길 기대하지만, 실제로는 첫 번째 <부터 마지막 >까지 통째로 삼켜버려서 안녕 반가워요 오늘도까지 다 날아가 버려요. 이게 바로 탐욕적(greedy) 매칭이라는 정규식의 기본 습성 때문이에요. 진짜로 HTML이나 JSON을 다뤄야 한다면 전용 파서 라이브러리를 쓰는 게 정답이에요.
01.4 처음엔 뭐부터 연습하면 좋을까요?
정규식은 코드부터 짜지 말고 온라인 테스터부터 열어보는 걸 추천해요. regex101.com 같은 사이트에 가면 정규식을 입력하는 즉시 어느 부분이 매칭되는지 색깔로 실시간 표시해줘서, 머릿속으로 상상만 하지 않고 눈으로 바로바로 확인할 수 있어요.
연습 순서는 이렇게 잡아보시길 추천해요. 지금 쓰고 있는 프로젝트나 업무에서 반복적으로 나오는 문자열 패턴을 하나 골라보세요. 그 패턴을 말로 먼저 풀어써 보는 거예요, 숫자 세 자리, 하이픈, 숫자 네 자리 이런 식으로요. 그다음에야 정규식 문법으로 옮기는 거죠. 이 순서를 거꾸로, 그러니까 정규식 문법부터 외우려고 하면 오래 못 가서 지치더라고요. 저도 처음엔 그렇게 하다가 몇 번 포기했던 경험이 있어요.
또 하나 팁을 드리자면, 처음부터 완벽한 정규식을 쓰려고 하지 마세요. 이메일 검증 정규식도 완벽한 버전은 없어요. 일단 우리 상황에서 90퍼센트만 걸러내도 충분한 경우가 훨씬 많거든요. 나머지는 실제 데이터로 테스트해보면서 조금씩 다듬어가면 돼요.
오늘 나온 예시들을 regex101에 직접 붙여넣고 이것저것 바꿔보시면서 감을 익혀보세요. 손으로 직접 쳐보는 게 진짜 제일 빨라요. 오늘은 정규식이 어떤 도구고 왜 쓰는지 감만 확실히 잡고 가시면 충분해요.