[정규식 03] 아무 글자나 되는 점(.)과 이스케이프

이번 글의 주인공은 (.) 하나예요. 정규식에서 점은 그냥 마침표가 아니라 아주 특별한 뜻을 가진 기호랍니다. 이 점을 이해하고 나면 정규식이 왜 '패턴으로 찾는다'고 하는지 확 와닿을 거예요. 그리고 진짜 마침표를 찾고 싶을 때 쓰는 이스케이프도 같이 배워 볼게요. 오늘 내용은 초보가 특히 많이 실수하는 부분이라, 천천히 눌러가며 읽어 주세요.

03.1 점(.)은 무슨 뜻이에요?

정규식에서 .(점)은 '아무 글자나 한 개'를 뜻하는 특수문자예요. 그러니까 패턴에 점을 하나 찍으면 '이 자리에 어떤 글자가 오든 상관없다'는 말이 돼요. a든 7이든 공백이든, 뭐든 한 글자면 다 통과예요. 마치 '여긴 아무나 앉아도 되는 빈자리'라고 표시해 두는 것과 비슷해요.


여기서 '특수문자'라는 말은 '글자 그대로가 아니라 특별한 뜻을 가진 기호'라는 의미예요. 글자를 그대로 찾는 리터럴과는 반대되는 개념이죠. 점은 특수문자라서, 패턴 속 점은 마침표를 찾는 게 아니라 '아무 글자'라는 역할을 한다는 걸 꼭 기억하세요. 이 하나만 헷갈려도 결과가 완전히 달라지거든요. 그래서 정규식을 볼 때는 점이 나오면 '아, 여긴 아무 글자 한 자리구나' 하고 바로 알아보는 눈을 길러 두면 좋아요.

03.2 가운데 한 글자가 뭐든 상관없을 때

예를 들어 볼게요. c로 시작해서 t로 끝나는 세 글자를 찾고 싶어요. 가운데 글자는 뭐가 오든 상관없고요. 이럴 때 c.t라고 적으면 딱이에요.


패턴: c.t

대상: cat cot c t cut ct

매치: ['cat', 'cot', 'c t', 'cut']


cat, cot, cut이 잡힌 건 예상했겠지만, c t도 잡힌 게 재밌죠? 가운데가 공백인데도 잡혔어요. 점은 공백까지 포함해서 '무엇이든 한 글자'로 보거든요. 반대로 ct는 안 잡혔어요. 가운데에 글자가 아예 없기 때문이에요. 점은 '한 글자'를 뜻하지 '0글자'는 아니라는 점, 이게 핵심이에요. 반드시 한 자리는 채워져 있어야 해요. '아무 글자나'이지 '아무것도 없어도'가 아니라는 걸 꼭 구분하세요.


이 성질을 잘 쓰면 손이 훨씬 덜 가요. 세 글자 단어인데 가운데 글자만 확실치 않을 때, 일일이 cat, cot, cut을 다 적는 대신 c.t 한 줄이면 되니까요. 후보가 많을수록 점 하나의 위력이 커진답니다.

03.3 점은 줄바꿈도 잡나요?

여기서 초보가 자주 걸려 넘어지는 함정이 하나 있어요. 점이 '아무 글자나'라면 줄바꿈(엔터)도 잡을 것 같잖아요? 그런데 기본적으로는 줄바꿈은 안 잡아요. 직접 볼게요.


패턴: a.b

대상: "a\nb aXb" (a와 b 사이에 줄바꿈이 있는 경우)

매치: ['aXb']


여기서 \n은 줄바꿈(다음 줄로 넘어가는 신호)을 뜻해요. aXb는 가운데가 X라서 잘 잡혔는데, 줄이 바뀐 a(엔터)b는 안 잡혔죠? 기본적으로 점은 '같은 줄 안의 아무 글자'만 잡고 줄바꿈은 건너뛰지 않아요. 여러 줄에 걸친 글을 다룰 때 '왜 안 잡히지?' 하고 당황하기 딱 좋은 지점이에요. 줄바꿈까지 포함시키고 싶으면 DOTALL(닷올)이라는 옵션을 따로 켜야 하는데, 지금은 '점은 기본적으로 줄바꿈을 안 먹는다'만 기억하면 충분해요.

03.4 진짜 마침표를 찾고 싶어요

자, 그럼 진짜 마침표(점 글자 그 자체)를 찾고 싶으면 어떡할까요? 점은 특수문자라 '아무 글자'로 해석되니, 그 특수 능력을 잠깐 꺼 줘야 해요. 이렇게 특수 능력을 끄는 걸 이스케이프(escape)라고 하고, 방법은 앞에 역슬래시(\)를 붙이는 거예요. 버전 문자열 3.14에서 '3, 진짜 점, 14'를 정확히 찾아볼게요.


패턴: 3\.14

대상: 3.14 3x14 3a14

매치: ['3.14']


\.은 '특수문자 점을 평범한 마침표 글자로' 바꿔 줘요. 그래서 진짜 점이 들어간 3.14만 정확히 잡혔죠? 뒤의 3x14, 3a14는 점이 아니라서 빠졌어요. 정리하면 역슬래시(\)는 '뒤에 오는 특수문자의 마법을 꺼라'라는 신호예요. 앞으로 특수문자 자체를 글자로 찾고 싶을 때마다 이 역슬래시가 등장한답니다.

03.5 이스케이프를 깜빡하면 어떻게 돼요?

그럼 이스케이프를 깜빡하면 무슨 일이 벌어질까요? 위와 똑같이 3.14를 찾으려다가 점 막는 걸 잊어버렸다고 해 볼게요.


패턴: 3.14 (점을 안 막음)

대상: 3.14 3x14 3a14

매치: ['3.14', '3x14', '3a14']


이런! 원하지 않던 3x143a14까지 전부 잡혀 버렸어요. 점을 그냥 두면 '아무 글자나'가 되니까, 3 다음에 아무 글자 하나, 그다음 14면 다 통과시켜 버린 거예요. 무심코 지나치면 '왜 이상한 게 잡히지?' 하며 한참 고민하게 되는, 초보가 정말 자주 만나는 버그(오류)예요. 그래서 점 글자 자체를 찾을 때는 반드시 앞에 역슬래시를 붙여 \.로 써야 해요. 이 습관 하나가 나중에 골치 아픈 오류를 많이 막아 준답니다.

03.6 점 말고 다른 기호도 조심해야 해요?

좋은 질문이에요. 사실 점 말고도 특별한 뜻을 가진 기호가 여럿 있어요. *, +, ?, (, ), [, ] 같은 기호들이 그래요. 이 기호들도 점과 똑같이, 그 기호 자체를 글자로 찾고 싶으면 앞에 역슬래시를 붙여 이스케이프해 줘야 해요.


그러니 '역슬래시는 특수문자의 마법을 끄는 스위치'라는 오늘의 규칙 하나만 잘 익혀 두면, 어떤 특수문자를 만나도 당황하지 않고 대처할 수 있어요. 반대로, 이미 특별한 뜻이 없는 평범한 글자(a, b, 1, 2 같은 것) 앞에는 역슬래시를 붙일 필요가 없어요. 필요할 때만 딱 붙이면 돼요.

03.7 점이 요긴한 순간은 언제예요?

점이 '아무 글자나'라는 게 처음엔 좀 막연하게 느껴질 수 있어요. 그런데 실제로 쓸모가 많아요. 예를 들어 '앞뒤 글자는 정해졌는데 가운데 한 자리만 아무 글자여도 되는' 경우, 또는 '형식은 아는데 한 칸이 매번 바뀌는' 경우에 점 하나로 그 자리를 뻥 뚫어 둘 수 있거든요. 오늘 본 c.t가 딱 그런 예였죠.


반대로, 찾을 글자가 정확히 정해져 있다면 굳이 점을 쓰지 말고 그 글자를 그대로(리터럴로) 적는 게 좋아요. 점은 편한 만큼 '너무 많이' 잡아 오기도 하니까요. 3.14 예제에서 점을 안 막았더니 3x14까지 딸려 왔던 것, 기억나시죠? '이 자리는 뭐가 와도 상관없다' 싶을 때만 점을 쓰는 게 요령이에요. 편리함과 정확함 사이에서 상황에 맞게 고르는 감각, 이게 정규식을 잘 쓰는 첫걸음이에요.

03.8 오늘 배운 내용 정리

오늘 핵심을 정리할게요. 정규식에서 .(점)은 '아무 글자나 한 개'를 뜻하는 특수문자예요. 공백도 한 글자로 쳐서 잡지만, 0글자는 안 되고 한 자리는 꼭 채워져야 해요. 그리고 기본적으로 줄바꿈은 안 잡는다는 함정도 기억해 두세요.


진짜 마침표를 찾고 싶으면 이스케이프, 즉 앞에 역슬래시(\)를 붙여 \.로 써 주면 돼요. 이걸 깜빡하면 엉뚱한 글자까지 잡히는 버그가 생기니, '점을 찾을 땐 \.' 이 공식만은 꼭 외워 두시길 바라요. 이 규칙은 다른 특수문자에도 똑같이 통하니 정말 든든하죠? 점은 '뭐든 한 글자'라는 편리함과, 자칫 '너무 많이 잡는' 위험을 함께 가진 기호라, 상황에 맞게 골라 쓰는 감각이 중요해요. 오늘 이 두 얼굴을 다 보셨으니, 앞으로 점을 만나도 당황하지 않으실 거예요. 오늘도 정말 잘 따라오셨어요!