데이터 분석/텍스트 분석

[R] sub(), gsub(), 정규 표현식

BTC_기범 2022. 4. 8. 23:10
출처 : do it! 쉽게 배우는 R 텍스트마이닝

sub(), gsub() 

sub(), gsub() 함수는 지정한 패턴과 같은 부분을 제시한 문자로 대체할 때 사용된다.

 

sub() 함수는 'pattern' 파라미터 입력값과 같은 부분 중 문장 가장 앞에 위치하고 있는 부분만 'replacement' 파라미터에 입력한 문자열로 대체된다. 

 

gsub() 함수는 'pattern' 파라미터 입력값과 같은 부분 전체가 'replacement' 파라미터에 입력한 문자열로 대체된다.

 

예제)

xt <- "Data Analytics is useful. Data Analytics is also interesting"
words <- c('at','bat','cat','chaenomeloes','chase',
           'cheap','check','cheese','chick','hat')
words2 <- c('12 Dec','OK','http://','<TITLE>Time?<TITLE>','12345','')
text2 <- c('product.csv','order.csv','customer.csv')

sub(pattern = 'Data', replacement = 'Business', x=txt)
# "Business Analytics is useful. Data Analytics is also interesting"

gsub(pattern = 'Data', replacement = 'Business', x=txt)
# "Business Analytics is useful. Business Analytics is also interesting"

gsub(pattern = 'Data', replacement = '', x=txt)
# " Analytics is useful.  Analytics is also interesting"

gsub('.csv','',text2)
# "product"  "order"    "customer"

sub('.csv','',text2)
# "product"  "order"    "customer"

정규표현식(= 정규식)

정규표현식, 정규식은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.

 

예제)

words <- c('at','bat','cat','chaenomeloes','chase',
           'cheap','check','cheese','chick','hat')

words2 <- c('at','bat','cat','chaenomeloes','chase',
           'cheap','check','cheese','chick','hat', 'chasse', 'chse', 'ca-t')
           
grep("che", words, value = TRUE) # 'che' 문자열을 포함한 것 출력
# "cheap"  "check"  "cheese"

grep('at', words, value = TRUE) # 'at' 문자열을 포함한 것 출력
# "at"  "bat" "cat" "hat"

grep('[ch]', words, value = TRUE) # 'c' 또는 'h' 문자열을 포함한 것 출력
# "cat"          "chaenomeloes" "chase"        "cheap"       
# "check"        "cheese"       "chick"        "hat"

 

 

문자 클래스

[:digit:] # [0-9], 0~9까지 숫자

[:lower:] # [a-z], a~z까지 소문자 알파벳

[:upper:] # [A-Z], A~Z까지 대문자 알파벳

[:alpha:] # [A-z], A~Z와 a~z 대소문자 알파벳

[:alnum:] # [A-z0-9], A~Z, a~z, 0~9 대소문자 알파벳과 숫자

[:punct:] # 문장부호: [!"#$%&'()*+,-./:;<=>?@[]^__`{|}~]

[:blank:] # 블랭크 문자: 스페이스, 탭

[:space:] # 스페이스 문자: 스페이스, 탭, 새라인, 폼피드, 캐리지리턴

[:print:] # [[:alnum:][:punct:][:space:]]

[:graph:] # [[:alnum:][:punct:]]

 

예제)

words3 <- c('12 Dec','OK','http://','<TITLE>Time?<TITLE>','12345',' ')

grep('[[:alnum:]]', words3, value = TRUE)
# "12 Dec"              "OK"                  "http://"            
# "<TITLE>Time?<TITLE>" "12345" 

grep('[[:alpha:]]',words3, value = TRUE)
# "12 Dec"              "OK"                  "http://"            
# "<TITLE>Time?<TITLE>"

grep('[[:digit:]]', words3, value = TRUE)
# "12 Dec" "12345" 

grep('[[:punct:]]', words3, value = TRUE)
# "http://"             "<TITLE>Time?<TITLE>"

grep('[[:space:]]', words3, value = TRUE)
# "12 Dec" " "

수량자

? # 앞 문자는 0회 또는 1회 사용

* # 앞 문자는 0회 이상 반복됨

+ # 앞 문자는 1회 이상 반복됨

{n} # 앞 문자는 n회 반복됨

{n, } # 앞 문자는 n회 이상 반복됨

{n, m} # 앞 문자는 n회 이상, m회 이하 반복됨

예제)

words2 <- c('at','bat','cat','chaenomeloes','chase',
           'cheap','check','cheese','chick','hat', 'chasse', 'chse', 'ca-t')

grep("chas?e", words2, value=TRUE)
#  "chaenomeloes" "chase"

grep("chas*e", words2, value=TRUE)
# "chaenomeloes" "chase"        "chasse"

grep("chas+e", words2, value=TRUE)
# "chase"  "chasse"

문자 클래스 시퀀스

\w # 단어 문자, [[:alnum:]_]

\W # 단어 문자를 제외한 문자, [^[:alnum:]_]

\d # 숫자, [[:digit:]]

\D # 숫자를 제외한 문자, [^[:digit:]]

\s # 스페이스 문자, [[:space:]]

\S # 스페이스 문자를 제외한 문자, [^[:space:]]

\b # 단어 경계의 빈 문자열

\B # 단어 경계가 아닌 빈 문자열, 단어 양쪽 끝을 제외한 빈 문자열

\< # 단어 시작

\> # 단어 끝

예제)

grep('\\w+', words3, value =TRUE)
# "12 Dec"              "OK"                  "http://"
# "<TITLE>Time?<TITLE>" "12345"
grep('\\s+', words3, value =TRUE)
# "12 Dec" " "

grep('\\d+', words3, value =TRUE)
#  "12 Dec" "12345"

grep('\\D+', words3, value =TRUE)
# "12 Dec"              "OK"                  "http://"            
# "<TITLE>Time?<TITLE>" " "

메타 문자

^ # 문자의 시작

$ # 문자의 끝

예제)

grep('^c', words2, value=TRUE)
# "cat"          "chaenomeloes" "chase"        "cheap"       
# "check"        "cheese"       "chick"        "chasse"      
# "chse"         "ca-t"   

grep('t$', words2, value=TRUE)
# "at"   "bat"  "cat"  "hat"  "ca-t"

grep('^c.*t$', words2, value = TRUE)
# "cat"  "ca-t"

grep('^[ch]?at', words2, value=TRUE)
# "at"  "cat" "hat"

주의! 대괄호('[]') 속에서 '^' 기호는 뒤의 문자를 제외한 나머지 문자를 의미한다.