10. 정규 표현식
in Study on R Programming
Overview
R에서 정규 표현식(정규식, Regex)을 사용하는 방법을 다룬다.
R에서 제공하는 stringr 패키지를 사용하여 문자열을 효과적으로 처리할 수 있다.
정규 표현식
Use | Descriptions |
---|---|
\\d | 숫자 |
\\D | 숫자가 아닌 것 |
\\s | 공백 |
\\S | 공백이 아닌 것 |
\\w | 단어 |
\\W | 단어가 아닌 것 |
\\t | Tab |
\\n | New 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" # 오른쪽 공백 제거