데이터는 문재인 대통령 취임사 자료를 가져온 text파일입니다.
Lines=readLines('moon.txt',encoding = 'UTF-8')
# Lines=read_lines('moon.txt')
? : 0번 또는 1차례까지의 발생을 의미
* : 0번 이상의 발생을 의미
+ : 1번 이상의 발생을 의미
{n} : n 번만큼 일치
{min,} : "min"번 이상만큼 일치
(strings <- c("a", "ab", "acb", "accb", "acccb", "accccb"))
[1] "a" "ab" "acb" "accb" "acccb" "accccb"
#c가 0번 이상 발생
grep("ac*b", strings, value = TRUE)
[1] "ab" "acb" "accb" "acccb" "accccb"
#c가 1번 이상 발생
grep("ac+b", strings, value = TRUE)
[1] "acb" "accb" "acccb" "accccb"
#c가 0번 혹은 1번 발생
grep("ac?b", strings, value = TRUE)
[1] "ab" "acb"
#c가 2번 발생
grep("ac{2}b", strings, value = TRUE)
[1] "accb"
#c가 2번이상 발생
grep("ac{2,}b", strings, value = TRUE)
[1] "accb" "acccb" "accccb"
^ : 문자열이나 행의 처음을 의미
$ : 문자열이나 행의 끝을 의미
( ) : 여러 식을 하나로 묶을 수 있다. "abc¦adc"와 "a(b¦d)c"는 같은 의미
일치하는 패턴들 중 n번째를 선택
\b: 단어 양쪽 끝에 위치한 빈문자열을 매칭
\B: 단어 끝에 위치하지 않는 빈문자열을 매칭
$*+.?[]^{}|()\
등을 사용하려면 \
을 먼저 적고 사용해야된다
ex) \$
(strings <- c("abcd", "cdab", "cabd", "c abd"))
[1] "abcd" "cdab" "cabd" "c abd"
#'c ' 로시작하는 문자열 매치
grep('^c ',strings,value=T)
[1] "c abd"
#d로 끝나는 문자열 매치
grep('d$',strings,value=T)
[1] "abcd" "cabd" "c abd"
#여러 패턴을 하나로 묶음
grep('ab(c|d|$)',strings,value=T)
[1] "abcd" "cdab" "cabd" "c abd"
#a 양옆에 공백이 존재하는 문자열을 매치
grep('\\ba',strings,value=T)
[1] "abcd" "c abd"
#a 양옆에 공백이 없는 문자열을 매치
grep('\\Ba',strings,value=T)
[1] "cdab" "cabd"
[A-z] : 영어를 추출
[^A-z] : 영어가 아닌 값 추출
정수 추출 : '\\d', [0-9], [:digit:]
연결된 대문자 추출 '[A-Z]+', [:upper:]
연결된 영어 추출 '[A-z]+',[:alpha:]
연결된 소문자 추출'[a-z]+' , [:lower:]
연결된 소문자 중 길이 제한 : '[a-z]{1,4}'
공백 추출 : [:black:], [:space:] \\s
특수문자 추출 : [:punct:]
문자+숫자 추출 : [:alnum:], \\w
[^],[:^:] : 괄호안에 ^이 있으면 반대의 의미
한글 추출 : [ㄱ-힣], \\p{Hangul}
text=paste0(c(letters,LETTERS,'가 나 다
0123 _+'),collapse = '')
#영문 국문 숫자
str_extract_all(text,'[:alnum:]')
[[1]]
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x" "y" "z" "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L"
[39] "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z" "가" "나" "다" "0" "1"
[58] "2" "3"
#영문 국문
str_extract_all(text,'[:alpha:]')
[[1]]
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x" "y" "z" "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L"
[39] "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z" "가" "나" "다"
#공백과 탭
str_extract_all(text,'[:blank:]')
[[1]]
[1] " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
#공백
str_extract_all(text,'[:space:]')
[[1]]
[1] " " " " "\n" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
#숫자
str_extract_all(text,'[:digit:]')
[[1]]
[1] "0" "1" "2" "3"
#소문자
str_extract_all(text,'[:lower:]')
[[1]]
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x"
[25] "y" "z"
#대문자
str_extract_all(text,'[:upper:]')
[[1]]
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X"
[25] "Y" "Z"
#대문자 제외
str_extract_all(text,'[:^upper:]')
[[1]]
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x" "y" "z" "가" " " "나" " " "다" "\n" " " " " " " " " " " " "
[39] " " " " " " " " " " " " " " " " "0" "1" "2" "3" " " " " "_" "+"
#특수문자
str_extract_all(text,'[:punct:]')
[[1]]
[1] "_"
gsub(‘a’,‘b’,문자열) : 문자열에서 a에 해당하는 부분을 b로 치환하는 함수
gsub('ab','',c('ab','ab 1','ab 3'))
[1] "" " 1" " 3"
#ab를 가진 값 중 ab 1의 1값을 34로 바꾼다.
gsub('(ab) 1','\\1 34',c('ab','ab 12','ab 3','1','ab1'))
[1] "ab" "ab 342" "ab 3" "1" "ab1"
pattern
<.+?> or <.*?> <>괄호 안에 문자 제거
(.+?)
'<.*?특정문자' 꺽쇠로 시작하고 특정문자를 포함하는 모든 문자 제거
#<>안에 임의의 문자열이 1번이상 발생하는 패턴을 ''으로 변환
gsub('<.+?>','','<https://www.naver.com>')
[1] ""
#<>안에 임의의 문자열이 0번이상 발생하는 패턴을 ''으로 변환
gsub('<.*?>','','<https://www.naver.com>')
[1] ""
#()안에 임의의 문자열이 1번이상 발생하는 패턴을 ''으로 변환
gsub('(.+?)','','(010-4214-7733)')
[1] ""
stringr 패키지는 문자열을 가능한 한 쉽게 처리하도록 설계 함수 세트를 제공
str_detect() 정규식에 맞는 문자열이 존재하는지를 T,F 로 반환
str_count() 정규식에 맞는 문자열의 갯수 반환
str_which() 정규식에 맞는 문자열이 앞에서 부터 몇 번째 있는지 반환
str_locate() 메소드는 string 중에 해당 정규식에 맞는 문자열의 시작점과 종료지점을 반환
library(XML)
library(stringr)
#문자열이 '김정은'을 포함하면 TRUE , 그렇지 않으면 FALSE를 반환
str_detect(Lines,'김정은')
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[17] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[33] FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
#문자열이 '김정은'을 포함하는 것의 갯수 반환
str_count(Lines,'김정은')
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0
#문자열이 '김정은'을 포함하는 것의 위치 반환
str_which(Lines,'김정은')
[1] 23 32 34 35
#문자열이 '김정은'을 포함하는 것의 시작위치 끝위치 반환
str_locate(Lines,'김정은')
start end
[1,] NA NA
[2,] NA NA
[3,] NA NA
[4,] NA NA
[5,] NA NA
[6,] NA NA
[7,] NA NA
[8,] NA NA
[9,] NA NA
[10,] NA NA
[11,] NA NA
[12,] NA NA
[13,] NA NA
[14,] NA NA
[15,] NA NA
[16,] NA NA
[17,] NA NA
[18,] NA NA
[19,] NA NA
[20,] NA NA
[21,] NA NA
[22,] NA NA
[23,] 1 3
[24,] NA NA
[25,] NA NA
[26,] NA NA
[27,] NA NA
[28,] NA NA
[29,] NA NA
[30,] NA NA
[31,] NA NA
[32,] 4 6
[33,] NA NA
[34,] 35 37
[35,] 1 3
[36,] NA NA
[37,] NA NA
[38,] NA NA
[39,] NA NA
[40,] NA NA
[41,] NA NA
str_extreact(문자열,패턴) : 패턴에 해당하는 문자열을 벡터로 출력
str_match(문자열,패턴) : 패턴에 해당하는 문자열을 메트릭스로 출력
str_subset(문자열,패턴) : 패턴에 해당하는 문자열 출력
strings <- c(" 010 733 8965", "010-293-8753 ", "banana", "010 794 7569",
"010 287 6718", "apple", "011.398.9187 ", "011 952 3315",
"011 923 8115 and 010 566 4692", "Work: 010-499-7527", "$1000",
"Home: 543.355.3679")
strings
[1] " 010 733 8965" "010-293-8753 " "banana"
[4] "010 794 7569" "010 287 6718" "apple"
[7] "011.398.9187 " "011 952 3315" "011 923 8115 and 010 566 4692"
[10] "Work: 010-499-7527" "$1000" "Home: 543.355.3679"
#패턴(폰번호)
phone <- "([0-9][0-9]{2})[- .]([0-9]{3})[- .]([0-9]{4})"
#문자열에서 폰번호 찾기(1)
str_extract(strings, phone)
[1] "010 733 8965" "010-293-8753" NA "010 794 7569" "010 287 6718" NA
[7] "011.398.9187" "011 952 3315" "011 923 8115" "010-499-7527" NA "543.355.3679"
#문자열에서 폰번호 찾기(2)
str_match(strings, phone)
[,1] [,2] [,3] [,4]
[1,] "010 733 8965" "010" "733" "8965"
[2,] "010-293-8753" "010" "293" "8753"
[3,] NA NA NA NA
[4,] "010 794 7569" "010" "794" "7569"
[5,] "010 287 6718" "010" "287" "6718"
[6,] NA NA NA NA
[7,] "011.398.9187" "011" "398" "9187"
[8,] "011 952 3315" "011" "952" "3315"
[9,] "011 923 8115" "011" "923" "8115"
[10,] "010-499-7527" "010" "499" "7527"
[11,] NA NA NA NA
[12,] "543.355.3679" "543" "355" "3679"
#특정패턴 벡터로 반환
str_extract('banana', 'na')
[1] "na"
#특정패턴 행렬로 반환
str_match('banana', 'na')
[,1]
[1,] "na"
#문자열 내 특정패턴 모두를 벡터들의 리스트로 반환
str_extract_all('banana', 'na')
[[1]]
[1] "na" "na"
#문자열 내 특정패턴 모두를 행렬들의 리스트로 반환
str_match_all('banana', 'na')
[[1]]
[,1]
[1,] "na"
[2,] "na"
#숫자를 포함한 라인 추출
str_subset(Lines,'[0-9]+[ㄱ-힣]')
[1] "남북군사공동위원회를 가동해 군사 분야 합의 사항의 이행을 위한 상시적 협의를 진행하기로 했습니다. 1953년 정전협정으로 포성은 멈췄지만 지난 65년 전쟁은 우리의 삶에서 계속되었습니다. 죽어야 할 이유가 없는 젊은 목숨들이 사라졌고, 이웃들 사이에 보이지 않는 벽이 생겼습니다. 한반도를 항구적 평화지대로 만들어감으로써 우리는 이제 우리의 삶을 정상으로 돌려놓을 수 있게 되었습니다."
[2] "평화와 번영을 바라는 우리 겨레의 마음은 단 한 순간도 멈춘 적이 없습니다. 빠르게 보이지만 결코 빠른 것이 아닙니다. 이러한 일들은 오랫동안 바라고, 오래도록 준비해 온 끝에 오늘 우리 앞에 펼쳐지고 있는 것입니다. 하나로 모인 8천만 겨레의 마음이 평화의 길을 열어냈습니다. 우리는 우리가 만들어낸 이 길을 완전한 비핵화를 완성해 가며 내실 있게 실천해 가야 할 것입니다."
[3] "2032년 하계올림픽의 남북 공동 개최 유치에도 함께 협력하기로 했습니다."
[4] "3.1운동 100주년 공동 행사를 위한 구체적 준비도 시작하기로 했습니다."
[5] "10월이 되면 평양예술단이 서울에 옵니다. '가을이 왔다' 공연으로 남과 북 사이가 더욱 가까워질 것입니다."
스크래핑이란 Webpage에서 원하는 자료를 긁어오는 것 R에는 다양한 스크래핑 방법들이 있다. rvest 패키지나, RSelenium, XML, RCurl패키지 등이 있다. 아래는 XML 패키지만을 예로 들었으며 RSelenium과 rvest의 경우 웹에 대한 배경지식이 필요하므로 생략
if (!require("XML")) install.packages("XML")
if (!require("stringr")) install.packages("stringr")
#url 생성
a<-'https://www.pizzaetang.com/findUs/findUs.asp?cPage='
b<-'&sAct=&sido=&gugun=&seeText=&branch_id='
#빈 데이터 생성
alldata<-data.frame(store=NULL,add=NULL)
for(i in 1:50){
url<-paste0(a,i,b)
line<-readLines(url,encoding="UTF-8")
#문자열 클렌징
add<- line[which(str_detect(line,"t_gray"))[-1]]
(add<- gsub("\\t| ", "", add))
(add<- gsub("<.*?>", "", add))
(store<-line[which(str_detect(line,"t_gray"))-1][-1])
(store<- gsub("\\t|/|\\d+\\-+|\\d+", "",store))
(store<- gsub("<.+?>|--", "",store))
alldata<-rbind(alldata,data.frame(store,add,stringsAsFactors=F))}
rownames(alldata)<-NULL
alldata