728x90
오랜만에 정규표현식을 다시 보게 됩니다. 정규표현식은 너무 다양하여 문법을 기억하기도 쉽지 않고
그렇다고 자주 사용하는 것도 아니라서 자주 까먹게 됩니다. 
이런 경험은 "레이텍(Latex)" 을 공부할 때에도 느낀 점입니다.

위키백과에서 인용한 글

"grep은 엄밀히 말하면 두문자어(머리글자로 된 말)는 아니지만 global / regular expression / print 에서 각각의 머릿글자를 따 온 것이며 이것은 ed 텍스트 편집기에서 쓰이는 연속적인 지시어이다. grep 명령어는 파일이나 표준 입력을 검색하여 주어진 정규 표현식과 맞는 줄을 찾아 프로그램의 표준 출력으로 출력한다."

 

 

일단 다음과 같이 랜덤으로 id 란 벡터를 만들어 봅니다. 

id는 수시로 고쳐나갈 계획입니다.

id <- c("A0001","12345","ABCDE","ABDCE","ABCCD","00B02","A3001","00A03","AB001","00AB01","B001",
        "A001B","C005","A135","A00A","000B","C00A","A0A5","0AA5","A203",
        "강좌와 통계","서울시")
id

 

(1-1) 'A' 문자가 들어가 있는 것을 추출 - grep("A",id,value=T) 

Q) 우선 A가 들어가 있는 것을 추출하시오.... 

>>> grep("A",id,value=T)  # 변수 id 에 "A" 가 들어가 있는 것을 추출하는 명령문입니다.

 

(1-2) 'A' 문자로 시작하는 것들 추출 - grep("^A",id,value=T) 

Q)  A로 시작하는 문자열을 추출하시오... ^ 를 사용 . 

 

(1-3) 'A' 문자로 나는 것들 추출 - grep("A$",id,value=T) 

Q)  A로 끝나는 문자열을 추출하시오...  $ 를 사용 . 

(2-1) 'AB' 문자 2개인 경우 - 'AB'  연속으로 있는 것들 추출 - grep("AB",id,value=T) 

Q)  이제 문자열 2개 이상인 경우를 다룹니다. AB 문자열이 들어가는 문자열을 추출하시오...  AB 사용 

 

(2-1) 'AB' 문자 2개 중 하나 - 'AB' 중, A 또는 B 추출 - grep("[AB]",id,value=T) 

Q)  AB 중 어느 문자(A 또는 B)라도 포함하는 문자열을 추출하시오...  [ ] 를 사용 

(3-1) 숫자가 들어가 있는 것 추출 -  grep("[0123456789]",id,value=T) 

문자만으로 되어 있는 것은 제외됨

(3-2) 숫자가 들어가 있는 것 추출 -  grep("[0-9]",id,value=T) * (3-1)과 같음

문자만으로 되어 있는 것은 제외됨

(3-3) 숫자가 들어가 있는 것 추출 -  grep("\\d",id,value=T) * (3-1)과 같음

(3-4) 첫 글짜 숫자로 시작 추출 -grep("^\\d",id,value=T)

(3-5) 문자(A~Z)만 들어가 있는 것  추출 -grep("[A-Z]",id,value=T)

(3-6) 한글만 들어가 있는 것  추출 -grep("[가-힣]",id,value=T)

 

(4) 날짜형 추출 -grep("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170101")


다음은 날짜를 체크하는 예입니다.
grep("\\   d{4}    (0[1-9]|1[012])                      (0[1-9]|[12][0-9]|                      3[01])", "20170101") 설명

 

(1)   \\d{4}           : 숫자 4개 (연도계산)
(2)   (0[1-9]|1[012])  : 0, 그리고 1에서 9까지...(* 01부터 09까지) 또는 1 그리고 0,1,2 중하나 (* 10,11,12까지)   (월 계산)
(3)   (0[1-9]|[12][0-9]|3[01])  : 0, 그리고 1에서 9까지... (* 01부터 09까지)     (일계산 01~09일까지)
                                     또는 (1, 2 중하나) 그리고 (0~9중하나)          (일계산 10~29일까지)
                                     또는 3 그리고 (0 1 중 하나) 
(* 10,11,12까지)
   (일계산 30 또는 31일)
(4) , "20170101")            : 체크날짜

 

 

(5) 휴대폰 전화번호 추출 -grep("^\\d{3}-\\d{3,4}-\\d{4}",id,value=T") 
다음은 휴대폰 번호를 체크하는 예입니다.
id <- c("A0001","12345","010-12-3456","010-123-4567","010-1234-5678","010-12345-6789")
id
grep("^\\d{3}-\\d{3,4}-\\d{4}",id,value=T)  # 처음 숫자 3개  "-"   숫자 3개 또는 4개 

(1) grep ("^\\d{3}  처음 숫자 3개
(2) -    숫자 3개 뒤에 짝대기
(3) \\d{3,4} 숫자 3개 또는 4개
(4) -     숫자 3개 또는 4개 뒤에 짝대기
(5) \\d{4}"   마지막 숫자 4개     

 

(6) 이메일 추출 -grep("\\w+@\\w+\\.\\w+",id,value=T)

 

다음은 이메일  추출하는 예입니다.

id <- c("123@korea.com","12345","123%korea.com","010-1_@korea--.com","abc@daum.net")
id
grep("\\w+@\\w+\\.\\w+",id,value=T)

 

# 일단 @는 들어가고... 
# @ 앞에 w+ 로 숫자와 문자가 하나 이상 들어가고
# @ 뒤로 w+ 로 숫자와 문자가 하아 이상 들어가고
이 들어가고 
# . 뒤로 w+ 로 문자가 들어가고

 


* 기타 참고 및 정리

- "AB"가 들어 있는 문자열              "AB"    

- "AB"로 시작하는 문자열           "^AB"            
- "AB"로 끝나는 문자열             "AB$"     
- "AB"로 시작하고 "AB"로 끝나는 문자열   "^AB$"  
-  "1" 또는 "2" 또는 "3"가 들어가 문자열   "1|2|3"         
-  0부터 9까지 숫자 중 하나                "[0-9]"             
-  0부터 9까지 숫자가 3개 연속으로        "[0-9][0-9][0-9]"   
-  0부터 9까지 숫자가 3개 연속으로 { }    "[0-9]{3}"  

 

참고문헌: 

(1) R을 이용한 빅데이터 분석(임동훈)
(2) R을 이용한 텍스트 마이닝(백영민)

 

책 (1)은 텍스트마이닝을 처음 접하는 사람들에게 추천하고 싶다. 텍스트마이닝을 어렵게만 보지 말고 일단 쉽다고 덤벼들기에 알맞은 책인 것 같다. 그렇다고 막상 쉬운 것도 아니다. 암튼 내가 본 책 중에 감명깊게 본 책 중 하나이다.

 

책 (2)는 텍스트마이닝을 실제로 하고자 하는 사람들에게 추천하고 싶다. 텍스트마이닝은 우선 삽질(?) 노가다(?)를 거치는 지난한 작업이다. "삽질"이라고 하지만 무조건 삽을 들고 땅을 파는 것이 아니라, 지식과 기술이 필요한 분야이다. 그냥 "노가다"가 아니고, 인사이트를 구하는 목적을 가지고 그를 향해 가는 노가다 과정이다. 이 노가다 과정이 참 지루하기도 하지만, 하다보면 참 재미를 느끼게 되는 "프로세스"이다. 이는 데이터마이닝 분야도 마찬가지이다. 


책(2)를 보면서 "텍스트"마이닝이 그냥 "텍스트"를 다루는 것이긴 하지만, "통계학"에 대한 꽤 깊은 지식이 필요하게 되는 것을 보게 된다.  R 기능만 공부할 게 아니라, 통계학 공부를 권하고 싶다. 통계학 공부가 간단한 것은 아니지만 진짜로 시간을 많이 갖고, 여유를 갖고 천천히 하나씩 해 나가기를 권하고 싶다. 지루하면 중단하고, 다시 계속하고... 

 

 

+ Recent posts