10. 정규 표현식


r

Overview

R에서 정규 표현식(정규식, Regex)을 사용하는 방법을 다룬다.

R에서 제공하는 stringr 패키지를 사용하여 문자열을 효과적으로 처리할 수 있다.


정규 표현식

UseDescriptions
\\d숫자
\\D숫자가 아닌 것
\\s공백
\\S공백이 아닌 것
\\w단어
\\W단어가 아닌 것
\\tTab
\\nNew Line (엔터 문자)
^시작되는 글자
$마지막 글자
\Escape Character (탈출 문자)
|두 개 이상의 조건 (OR)
[a-z]영어 소문자
[A-z]모든 영문자
i+i가 최소 1회는 나오는 경우
i*i가 최소 0회 이상 나오는 경우
i?i가 최소 0회에서 최대 1회만 나오는 경우
(optional)
i{n}i가 연속적으로 n회 나오는 경우
i{n1,n2}i가 n1에서 n2회 나오는 경우
i{n,}i가 n회 이상 나오는 경우
’ , ‘ 뒤의 공백 유의
[:alnum:]문자와 숫자가 나오는 경우 : [:alpha:] and [:digit:]
[:alpha:]문자가 나오는 경우 : [:lower:] and [:upper:]
[:blank:]공백이 있는 경우
[:cntrl:]제어문자가 있는 경우
[:digit:]0 ~ 9
[:graph:]Graphical characters : [:alnum:] and [:punct:]
[:lower:]소문자가 있는 경우
[:print:]숫자, 문자, 특수문자, 공백 모두
[:space:]공백문자
[:upper:]대문자가 있는 경우
[:xdigit:]16진수가 있는 경우

stringr 패키지의 함수

str_detect()

원소별 패턴 검사를 위해 사용된다.

SQL의 like 연산자와 유사하다.

str_detect(target, pattern) # 대소문자 구분. 논리값으로 리턴
> v1 <- c('aa', 'ba', 'ccb', 'Ab', 'Bbc')
> str_detect(v1,'a')
[1]  TRUE  TRUE FALSE FALSE FALSE
> v1[c(T,T,F,F,F)]  # boolean 벡터
# 원소에 논리값을 매칭시켜서 true인 값만 색인하므로 데이터 추출에도 유용

[1] "aa" "ba"   # 원소 순서대로 boolean값이 전달
> emp[ c(T,F,F,...) , c(T,F,F,...) ]
# data frame 의 경우 행, 열 범위에 사용 가능
  • 정규식 표현
     v1[str_detect(v1,'a')]  # 순서 상관없이 'a'를 포함하는 원소 출력 
     str_detect(v1,'^a') #  'a' 로 시작하는 원소 (^는 시작의 의미)
     v1[str_detect(v1,'^a')] # 'a' 로 시작하는 원소 출력
     v1[str_detect(v1,'^[aA]')]  # 대소 상관 없이 'a' 로 시작하는 원소 출력
     # [aA] : a or A (문자열 표현식에서의 []는 하나의 글자 패턴의 완성)
    
     v1[str_detect(v1,'^[aAbB]')]    # 대소 상관 없이 'a' 혹은 'b' 로 시작하는 원소 출력
     v1[str_detect(v1,'^[aA][bB]')]  # 대소 상관 없이 a로 시작, 두 번째가 b
     # []는 하나의 글자를 의미. ^[][] 는 두 글자로 시작하는 원소를 의미 
    
     str_detect(v1,'a$') # 'a' 로 끝나는 원소 ($는 끝의 의미)
     v1[str_detect(v1,'a$')] # 'a' 로 끝나는 원소 출력
    

str_count() 함수

특정 문자의 출현 횟수 카운트를 위해 사용

> v1
[1] "aa"  "ba"  "ccb" "Ab"  "Bbc"
> str_count(v1.ignore.case('a'))    # 대소문자 구별 없이 카운트
Error in v1.ignore.case("a") : could not find function "v1.ignore.case"
> str_count(v1,'a') # 대소문자 구별
[1] 2 1 0 0 0

str_c() 함수

문자열 결합을 위해 사용

> str_c('cute','dog')
[1] "cutedog"
> v1
[1] "aa"  "ba"  "ccb" "Ab"  "Bbc"
> str_c('vector: ', v1) # 키 벨류 형태로 결합
[1] "vector: aa"  "vector: ba"  "vector: ccb" "vector: Ab"  "vector: Bbc"
> str_c(v1,' name is ',v1)  # 연결연산자를 사용하여 결합
[1] "aa name is aa"   "ba name is ba"   "ccb name is ccb" "Ab name is Ab"   "Bbc name is Bbc"
> str_c(v1, collapse="-")   # 구분 기호를 사용하면 벡터의 원소끼리 결합 
[1] "aa-ba-ccb-Ab-Bbc"

# 결합 함수의 주의점 !!!
> v1 <- c('a','b','c')
> str_c('a','b','c')    # 함수 내에 `분리된 인자`들을 연결
[1] "abc"
> str_c(v1) # 여러개의 값이 들어있는 `하나의 인자`를 연결하기 때문에 옵션이 필요
[1] "a" "b" "c"

> str_c('a','b','c', sep = ',') # 분리된 인자들을 연결
[1] "a,b,c"
> str_c(v1, collapse = ',')
[1] "a,b,c"

str_dup() 함수

원소마다 반복 출력을 위해 사용

> v1
[1] "aa"  "ba"  "ccb" "Ab"  "Bbc"
> str_dup(v1, 3)
[1] "aaaaaa"    "bababa"    "ccbccbccb" "AbAbAb"    "BbcBbcBbc"

str_length() 함수

문자열의 길이, 벡터의 각 원소의 길이 확인을 위해 사용

> str_length('hello')
[1] 5
> v1
[1] "aa"  "ba"  "ccb" "Ab"  "Bbc"
> str_length(v1)
[1] 2 2 3 2 3

str_locate() 함수

특정 문자와 매칭하는 문자열의 시작과 끝의 위치 확인을 위해 사용

> str_locate('abab','a')    # 첫 번째 'a'의 위치, 시작 위치와 끝 위치가 같음
     start end
[1,]     1   1
> str_locate('aabab','a')   # 첫 번째 'a'의 위치, 시작 위치와 끝 위치가 같음
     start end
[1,]     1   1
> str_locate('abaab','aa')  # 첫 번째 'aa'의 위치
     start end  # 특정 문자를 두 개 이상 구성 시 문자열의 시작 위치와 끝 위치가 다름(두 글자 이므로)
[1,]     3   4
> class(str_locate('abaab','aa'))   # 함수의 결과가 매트릭스 구조로 출력되는 것을 확인
[1] "matrix"

> v1
[1] "aa"  "ba"  "ccb" "Ab"  "Bbc"
> str_locate(v1,'a')    # 벡터의 각 원소별 확인도 가능
     start end
[1,]     1   1
[2,]     2   2
[3,]    NA  NA
[4,]    NA  NA
[5,]    NA  NA

str_locate_all() 함수

특정 문자와 매칭하는 문자열의 모든 위치 확인을 위해 사용

> v3 <- c('a','aba','b','ababab')
> v3
[1] "a"      "aba"    "b"      "ababab"
> str_locate_all(v3,'a')          
[[1]]              # 첫 번째 원소
     start end
[1,]     1   1

[[2]]              # 두 번째 원소
     start end
[1,]     1   1
[2,]     3   3

[[3]]              # 세 번째 원소
     start end

[[4]]              # 네 번째 원소
     start end
[1,]     1   1
[2,]     3   3
[3,]     5   5
> class(str_locate_all(v3,'a')) # 함수의 결과가 리스트 구조로 출력되는 것을 확인
[1] "list"
> str_locate_all(v3,'a')[[2]][2,1]  # 함수의 결과를 리스트로 접근 가능
start   #두 번째 원소의 두 번째 a의 위치
    3 

> v3 <- c('a)','ab)a','b)','aba)bab')
> v3
[1] "a)"      "ab)a"    "b)"      "aba)bab"
> str_locate(v3,'\\)')  # 그냥 괄호는 문법으로 인식하므로, 특수기호가 아니라는 \\ 기호를 사용
     start end
[1,]     2   2
[2,]     3   3
[3,]     2   2
[4,]     4   4

str_replace() 함수

str_replace() : 처음으로 매칭하는 값의 문자의 치환과 삭제에 사용 str_replace_all() : 매칭하는 모든 값의 문자의 치환과 삭제에 사용

> str_replace('apple','p','*')  # 처음으로 매칭하는 값만 치환 
[1] "a*ple"
> str_replace('apple','p','**')
[1] "a**ple"
> str_replace_all('apple','p','*')  # 매칭하는 모든 값을 치환 
[1] "a**le"
> v4 <- c('1,100', '2,300', '3,900')    # 1000 단위 구분기호, ','로 인해 문자로 인식
> v4 + 100  # 문자와 숫자는 연산 불가 !
Error in v4 + 100 : non-numeric argument to binary operator
> v4 <- str_replace(v4,',','')  # ',' 제거  
> as.numeric(v4) + 100  # 숫자형으로 변환 후 연산
[1] 1200 2400 4000

> v4 <- c('1,100,200', '1,002,300', '1,003,900')    # ','가 두 개 이상이라면 replace() 함수는 모두 치환이 불가
> v4 <- str_replace_all(v4,',','')  # replace_all() 함수를 사용
> as.numeric(v4) + 100
[1] 1100300 1002400 1004000

str_split() 함수

기호를 기준으로 문자열을 분리하기 위해 사용되며 리스트 형식으로 리턴

> animal <- str_c('pig', '/', 'dog', '/', 'cat')
> animal
[1] "pig/dog/cat"
> str_split(animal, '/')    # '/' 기호를 기준으로 분리
[[1]]   # 리스트 형식의 결과
[1] "pig" "dog" "cat"

str_sub() 함수

문자열에서 원하는 문자만 추출하기 위해 사용되며 매개변수는 문자의 인덱스값

> animal
[1] "pig/dog/cat"
> str_sub(animal, start = 1, end = 3)
[1] "pig"
> str_sub(animal, start = 5, end = 7)
[1] "dog"
> str_sub(animal, start = 5)    # end 생략 시 끝까지 추출
[1] "dog/cat"
> str_sub(animal, start = -4)   # 음수 기입 시, 뒤에서부터 n번째 위치를 기준으로 start
[1] "/cat"

str_trim() 함수

공백 제거 용도로 사용

공백 제거 방향은 옵션으로 설정할 수 있고, 중간 공백은 삭제되지 않음

중간 공백을 제거하기 위해서는 replace() 함수 사용

> str_trim(' pig dog cat ')
[1] "pig dog cat"                  # 양 쪽 공백 제거
> str_trim(' pig dog cat ', side = 'left')
[1] "pig dog cat "                 # 왼쪽 공백 제거
> str_trim(' pig dog cat ', side = 'right')
[1] " pig dog cat"                # 오른쪽 공백 제거





© 2019. by RaP0d

Powered by aiden