Regex 예제 둘 - 단어장

단어장 만들기 예제를 해보지요. 일단 좀 무식하게 공부하는 사람이 연설문에서 a로 시작하는 단어만 뽑아내겠다고 생각했다고 칩시다:

* 응용 패턴 1: [ \t]a[a-z]+

 

첫번째 '[ \t]a'의 의미는 '공백문자+a'로 시작하는 단어의 뜻이겠지요? 그래야 단어 중간에 있는 a랑 일치하지 않을테니까요. 그다음 [a-z]+ 의 의미는 a로 시작해서 어떤 문자든지(숫자나 공백말고) + 만큼(1번이상) 반복되는 경우를 찾으라는 겁니다.

이렇게 하면 a 는 찾지 않겠지요. +one or more의 뜻이니까요. 근데 짜증나게도 an, as같은 짧은 단어도 찾습니다. 그 정도 단어들은 너무 쉽다.. 최소한 3개는 되야...:

* 응용 패턴 2: [ \t]a[a-z][a-z]+'

 

이렇게 해주면 가운데 [a-z] 가 들어가니 3자리 문자만 나오겠지요. 아참, 대소문자 구분도 해주려면 [a-zA-Z] 가 되어야 한다는 거 잊지 말구요. 아니면 찾고 바꾸기에서 대소문자 체크를 꺼주던가.

근데 문제가 있지요?

"에이... 찾긴 했는데 일일이 뽑아내라구?"

그럴려면 regex 안쓰겠지요. 그럼 a 로 시작하는 단어 단어장 만드는 regex를 순서대로 실험해 보겠습니다. [네오퀘스트 특강 - 클린턴 연설문] 에 다음 regex를 순서대로 적용해 보는 걸로 합니다:

* 응용 패턴 3: [ \t][^a]* => ^p

* 응용 패턴 4: ^[^a]* => ^p

* 응용 패턴 5: [^a-z] => ^p

* 응용 패턴 6: ^[^a]*$ => ^p

* 응용 패턴 7: ^..$ => ^p

* 응용 패턴 8: \r\n\r\n => \r\n

 

사실 유닉스라면 좀더 융통성이 있는데 울트라 에디터는 제한적인 regex만 가능해 단계가 쓸데없이 좀 많습니다.

패턴 3은 a 로 시작하지 않는 단어를 몽땅 찾아냅니다. => ^p 라는 말은 바꾸기 상자에 ^p 를 넣어서 찾은 말을 모두 줄바꿈 표시로 (바꾸기 상자에서 ^p 는 울트라 에디터에서 줄바꿈 기호를 뜻합니다. 그럼 줄줄이 붙여줍니다.) 바꿔주라는 말입니다.

그냥 바꿔주면 다닥다닥 단어들이 붙어버리니까요.

패턴 4는 이렇게 바꾼 문서에 다시 a로 시작하지 않는 단어를 걸러내는 역할을 합니다. 처음 '^'는 줄의 시작을 뜻하며 [^a]* 는 a로 시작하지 않는 문자의 연속(*는 zero or more)을 뜻하니까요.

패턴 5에서 쉼표나 뭐 이런게 줄바꿈으로 바뀝니다. [^a-z]문자가 아닌 건 몽땅이라는 뜻이니까요. 그래서 a-non 식의 문자는 a 줄바꿈 non이 되지요. 그래서 다시 a로 시작하지 않는 문자를 바꿔줘야 합니다.

그게 패턴 6입니다. ^ 줄의 시작 + [^a]* a 로 시작하지 않는 단어의 연속 + $ 니까 줄의 끝이지요? 이걸 다시 ^p 로 바꿔주는 겁니다.

패턴 7은 선택입니다. '.'은 문자 하나를 뜻합니다. 어떤 문자든 상관없습니다. ^.$ 라고 하면 달랑 한줄에 문자 하나 있는 단어를 뜻합니다:

a A

 

이런거지요. 이걸 몽땅 다시 줄바꿈을 하는 겁니다. 두자리 문자도 싫고 세자리도 싫으면 '^..$', '^...$', 자리수만큼 . 을 사이에 넣어주면 됩니다:

aa aaa ab abc an

 

식의 단어가 모두 사라집니다. 마지막으로 줄바꿈이 엄청 많지요? 유닉스에서는 달랑 줄바꿈문자만 있는 줄을 날려버리는 이디엄이 있습니다. ^$ 라는 건데요. 줄의 시작을 알리는문자 바로 뒤에 줄의 끝을 알리는 문자가 오는 줄... 다시 말해 달랑 엔터만 친 줄을 뜻합니다. 이걸 몽땅 공백으로 바꿔주면 다 날라갑니다.

안타깝게도 울트라 에디터는 이걸 지원못합니다. 따라서 \r\n\r\n (윈도우니까) 식으로 다닥다닥 두줄이 연속해 붙어있는 걸 찾은 횟수 0이 나올때까지 서너번 돌려줘야 합니다.

마지막으로 파일 메뉴 np_icon_right_arrow.gif 정렬 메뉴np_icon_right_arrow.gif 파일 정렬메뉴 에서 순서대로 정렬을 해주면... 예 a 로 시작하는 단어장이 완성됩니다.

또 한번 느끼셔야 합니다. 사실 이거 설명만 길지 실제로 해보면 (손에 익으면) 10초도 안걸립니다. 수백 페이지건, 수천 페이지건, 아니 수만 페이지짜리 문서가 수천개가 널려 있건 상관이 없습니다. 울트라 에디터에서는 파일내에서 찾고 바꾸기도 지원을 하기 때문에 특정 디렉토리 아래, 또 그 하위 디렉토리까지 몽땅 파일을 찾아서 패턴을 바꿀 수도 있거든요. 이론상으로는 이 세상의 모든 문서에서 단어를 뽑아내는 일을 컴퓨터에게 시키고 여러분은 휴가를 다녀올 수도 있다는 겁니다 :-)

Regular Expression을 알고 쓰는 여러분은 이미 경쟁력이 남들보다 10년은 앞서갑니다. 아니 여기에 스크립팅 쬐끔 배우면 여러분만의 무슨 영어 문서든 단어장을 10초에 맹그는 도구를 갖게 될 수도 있습니다.

b 로 시작하는 단어장... 쉽겠지요? :

* 응용 패턴 9: [ \t][^ab]* => ^p

 

이렇게 a랑 b 를 함께 찾을 수도 있습니다. a 단어장이랑 b 단어장이 좀 적다 싶으면 앞에 나온 패턴들에 a 부분을 ab로 바꿔주면 되는거지요.

좀 어려웠나요? 그럼 쉬운거 몇개 해보고 비법 전수를 끝내도록 하지요 :-)


+ Recent posts