본문 바로가기

기타

정규식을 배워보아요. ^^

정규식 해서 남 안주기
작성일 : 2008.4.13 (일)
by KPUG. Freedom^^
 
안녕하세요.
정규식이란 말 한번 들어보지 않으셨습니까?
난데없이 왜 정규식에 대한 글을 쓰냐고 한다면 정말 좋아서 전파할만한 가치가 있기 때문이죠.그리고 주말을 충실하게 보내고자 함입니다. 기왕에 컴퓨터 앞에서 뒹굴꺼면 생산적인 일이 나을꺼라는 혼자만의 생각입니다. ^^;
 
예를 들어서 아래와 같은 데이터가 있는데 2000년 들어서 2자리 년도를 전부 4자리로 고쳐야 한다면?
이건 '바꾸기' 기능으로도 불가능한 일이죠. 정규식을 쓰면 단번에 해결할 수 있습니다. 
 
80년 생산
90년 생산
2000년 생산
찾기 : ([0-9][0-9])생산
바꾸기 : 19\1생산
 
 
 

주말에 2시간정도만 시간을 들이면 평생을 잘 써먹을 수 있으니 한번 해보시기 바랍니다.
링크는 넷상에서 '대두족장' 이라는 분이 쓰신 정규식 강좌를 HWP 파일로 옮겨놓은 것입니다.
일단 머리를 굴리는데는 모니터보다는 인쇄물을 보는 것이 나으니 출력해서 보고, 직접 메모해가면서 공부하시면 금방 익힐 수 있습니다. 스스로 해보지 않으면 절대로 늘지 않습니다. 저도 그랬으니까요.
 
정규식프로그램은 '대두족장' 님께서 만드신 정규식 에디터를 기준으로 합니다. 정규식만 쓸 수 있도록 만들어 놓고 검색된 것을 강조해줘서 초보자에게는 상당히 편리한 프로그램입니다. 익숙해지면 나중에 editplus 같은 강력한 편집기를 써도 좋으나 정규식에만 관해서는 이 프로그램을 따라가지 못할 것 같습니다.
 
그분의 글을 읽어보시고, 이 강좌도 보시고, 소개한 프로그램으로 실습도 해보면서 익히시길 바랍니다.
 
# 정규식이란?
정규식이란 간단히 말해서 문서에서 원하는 패턴을 찾아서 바꾸기 위한 수식입니다. 규칙만 찾으면 어떤 자료든 원하는대로 바꿀 수 있습니다. 그래서 대용량의 워드작업같은 것을 하는데 매우 용이합니다. 저도 컴퓨터 관련에 종사하는 사람은 아니지만 개인적으로 소책자나 자료만드는 것을 좋아해서 워드프로세서를 자주 쓰고는 하는데 이번에 공부한 정규식이 정말 많은 도움이 되었습니다.
 
아래의 내용이 당장 사용하기에 쓸데없는 내용이라고 생각할지 모르겠지만 일단 기본이 되어야 응용도 되는 법입니다. 이건 당해봐야 알 수 있습니다. 후후.
 
# 1장

 
A : 홍길동은 살아있다.
B : 아냐, 그는 죽었어.
 
전화번호 : 011-000-0000
전화번호 : 017-111-1111
전화번호 : 010-9999-9999
 
날짜 : 95년 2월 1일
 
 
 
 
 
 
 
 
 

* 찾기 : 홍길동.*\.
이렇게 하면 '홍길동은 살아있다.' 를 찾습니다.
.* 은 모든 문자입니다. \는 escape 문자라고 하는데 정규식에서 쓰는 문자가 아니라 일반문자로 쓸 수 있도록 해줍니다.

찾기

검색 결과
\.

.

[검색이 안됨]
\[ [
 
 
 
 
 


* 찾기 : [0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]
[0-9] - [] 안은 한문자를 의미합니다. 0에서부터 9까지 찾으라는 말입니다. [abc] 라고 쓰면 a,b,c 를 찾아줍니다. 절대로 ab, bc 를 찾지 않습니다. 만약 ab 를 찾고자 한다면 [abc][abc] 이렇게 해야겠지요.

* 찾기 : [0-9]{3}-[0-9]{3}-[0-9]{4}
{3} - 반복되는 개수입니다. 위의 찾기식과 비교해보면 알 수 있겠지요?
 
그럼 여기서 문제가 하나 생깁니다. 전화번호 방식이 하나는 중간이 세자리고 하나는 네자리인데 이걸 어떻해야할까요? 당연히 해결책이 있지요.
* 찾기 : [0-9]{3}-[0-9]{3,4}-[0-9]{4}
이렇게 하면 중간 3자리와 4자리를 모두 찾지요.
 
Q. 문제

011-000-0000

011 000 0000
 
 
이걸 한번 해보죠. 사이사이 '-' 를 지워야 합니다. 만약 바꾸기를 해서 - 문자를 모두 없애버린다면 다른데 있는 '-'문자도 모두 없애버리겠죠. 전화번호 사이에 있는 것만 지워야됩니다.
일단 찾아야겠죠.
 
찾기 : ([0-9]{3})-([0-9]{3,4})-([0-9]{4})
바꾸기 : \1 \2 \3
() - ()를 넣으면 변수가 됩니다. ()안에 있는 건 뭐가 나오든 바꿀 때 그대로 사용할 수 있게 해줍니다. 첫번째에 011이 나오든 012 가 나오든 바꿀 때 그대로 넣어주는 겁니다. ()의 개수대로 첫번째것은 \1, 두번째것은 \2 라고 하면 됩니다. ()를 안넣는다면? 바꾸기에 [0-9]{3}-[0-9]{3,4}-[0-9]{4} 이렇게 써주면 결과물도 그대로 되겠죠. 비교해보겠습니다.
 

찾기

바꾸기

결과물

[0-9][0-9][0-9]-

[0-9][0-9][0-9]*

[0-9][0-9][0-9]*

([0-9][0-9][0-9])-

\1*

011*

 
 
 
 

Q. 문제

95년 2월 1일

1995/2/1
 
 
풀어보시고 답을 보셔야 자기것이 됩니다. 성격도 급하시지... ^^;
찾기 : ([0-9][0-9])년 ([0-9](월 ([0-9])일
바꾸기 : \1/\2/\3
 
이것참 간단한 것 설명하기도 쉽지 않군요. 추가할 내용이나 문제점이 있으면 댓글 부탁드립니다. 그러면 그때그때 수정하지요. 수정판이 괜찮다 싶으면 HWP 파일로 배포하겠습니다. 아무래도 머리쓰는데는 종이가 좋은 것 같아요. 요즘들어 생각했습니다. 죽어도 익숙해지지 않던 정규식이 프린트해서 끄적거리며 문제를 풀어보려고 고민해보니 어느정도 익숙해지더군요. 그럼 다음으로 넘어갑니다.
 
# 2장

 
제1장. (목적) 정규식 배워서 남 안준다.
제2장. (효과) 워드 작업이 200% 는 빨라진다.
 
 
 
목차가 길게 있습니다. 제1장, 제2장을 1. 2. 로 바꿔서 간편하게 보고 싶은데 어떻게 해야할까요? 그리고 ()안에 있는 제목만 남기고 지워보고도 싶네요.
 
* 찾기 : ^제\d*장
^ - 줄의 시작입니다. 처음에 오는 단어같은 것만 찾을 때 유용하게 쓸 수 있습니다. 줄끝은 $
\d - [0-9]와 같은 뜻. 프린트물에 표현이 이것저것 있을겁니다. digit 의 약자입니다.
* - 숫자가 몇개가 되었든 찾으라는 것이죠. 그런데 0개인 것도 찾습니다. '제장' 이라는 단어도 찾는 것이죠.
 
여기서 문제가 생겼습니다. '제장'이라는 단어도 찾아버리네요. * 은 0개이상인 것은 모두 찾기 때문입니다. 그러면 여기서 + 가 등장합니다.
 
* 찾기 : ^제(\d+)장
* 바꾸기 : \1
+ - 1개 이상인 것만 찾습니다. 이렇게 하면 '제장'은 찾지 않지요.
뒤에 . 이 있으니 그대로 숫자로만 바꿉니다. 찾기를 할 때 .을 넣으면 더 정확하게 찾을 수 있겠지요.
 
* 찾기 : ^제(\d+)장\.
* 바꾸기 : \1.
이렇게 하면 정확도가 더 높아집니다. 솔직히 1000개가 넘는 검색결과가 있는데 그걸 일일이 확인할 수는 없지요. 그래서 다른 겹치는 것이 없도록 특이한 규칙이 있으면 추가해주는 것이 좋습니다.
 
이번에는 '1. 목적' 이런 식으로 뒤에 있는 사족을 빼보죠.
* 찾기 : ^제(\d+)장\. \((.*)\).*
* 바꾸기 : \1. \2
이제 슬슬 하기가 싫어지고 정신이 혼미해지기 시작하지요? ^^; 하나씩 해석해보겠습니다.
 
^ 제   (\d+)   장  \.  _  \(    (.*)    \)    .*
띄어쓰기는 '_' 로 고쳐놨습니다. 정규식은 공백도 문자로 인식하기 때문에 주의하셔야합니다.
벌려놓으니까 조금 눈에 들어오시나요?
 
1. ^ 제 문장의 시작에 있는 것만 찾는겁니다.
2. (\d+) 숫자를 찾아야겠죠? 두자리수가 넘어갈 수 있으니 + 로 1번이상의 숫자를 찾으라고 했습니다. \1 이죠.
3.
4. \._ '.'은 정규식 문자니까 \ 로 탈출시켜줘야겠지요. 그리고 공백이 들어가네요.
5. \( (도 정규식 문자니까.
6. (.*) 바꿔야 하니까 괄호를 넣고 모든 문자라고 했습니다. \2 가 되겠군요.
7. \)
8. .* 줄끝까지 모든 문자
 
나중에 보면 만든 사람도 해석을 해야 눈에 보입니다. 복잡해지면 복잡해질수록 어쩔 수 없지요. 후후~
그럼 다음에 뵙겠습니다.
 
# 3장

 
이번에는 버스노선도 추출작업의 일부에서 쓸만한 내용을 보겠습니다. 서울시 버스노선이 400개가 넘는데 정규식을 안쓰면 이런 작업은 불가능하겠죠? 소스를 추출한 다음 KDIC 으로 사전처럼 만드는데 정규식이 없으면 불가능한 작업입니다.
 
첫차
05:00
기점
서원초등학교
막차
23:00
종점
신림역
첫차 05:00  기점 서원초등학교
막차 23:00  종점 신림역
 
 
 
 
 
 
 
 
 

이걸 오른쪽과 같이 수정하고자 합니다. 정규식 에디터에 붙여넣고 한번 해보죠시요. 기본만 잘 이용해도 되는데 막상 완성된 정규식을 보면 때쳐치고 싶을지도 모릅니다. 후후.
 
아직까지 설명 안들인 것 중에서 \n 가 있는데 줄바꿈문자(enter) 의 뜻입니다. 그러니까 줄 끝에는 항상 \n 가 있는거죠. 위에서 첫차이면 컴퓨터는 '첫차\n' 으로 인식합니다.
\n 을 모두 없애면 한줄이 되겠죠.
 
찾기 : 첫차\n([0-9][0-9]:[0-9][0-9])\n기점\n(\W*)\n
막차\n([0-9][0-9]:[0-9][0-9])\n종점\n(\W*)\n배차
\W - 영문과 숫자를 제외한 모든 문자를 말합니다.
바꾸기 : 첫차 \1  기점 \2\n막차 \3  종점 \4\n배차

일단 이거 고민하는데 조금 시간이 걸릴거라 생각하므로 여기까지 하겠습니다.
모두 쓰는데 2시간이 넘게 걸렸네요. 설명이라는 작업이 보통 힘든게 아니군요. ^^;
나머지는 생각날 때 천천히 업데이트 하겠습니다.
 
참고자료 :
Expresso v3.0 도움말
'대두족장'님 블로그
Total Commander Regular Expression 도움말



'기타' 카테고리의 다른 글

윈도우 작업 효율화하기2  (0) 2009.01.10
윈도우 작업 효율화하기1  (0) 2009.01.10
더 편하게 타자를 치는 방법은 없을까  (1) 2009.01.10
넋두리 - 자작속지  (2) 2009.01.04
웹마  (0) 2009.01.03
방향제가 따로 필요없다. - 비누방향제  (0) 2009.01.01
PS/2 마우스에서 휠이 안될때  (0) 2008.11.02
핀마이크 PM-001 사용기  (1) 2008.10.18
자기계발의 시작  (0) 2008.08.03
버스노선 정보  (0) 2008.06.03