티스토리 뷰

반응형

정규 표현식



정규 표현식방대한 데이터에서 원하는 정보만 추출하고 싶을 때 유용하게 사용됩니다.

파이썬에서도 동일하게 적용되니까 알아두면 두루두루 잘 사용할 수 있겠죠!?



 

문자열 관련 유용한 패키지 stringr도 참고하세요!
[R] 문자열 관련 함수 - stringr 패키지, 정규식

 


 1. grep() 함수 : 특정 패턴만 골라내기


grep(패턴, 문자열)


stringr 패키지의 str_detect() 함수와 비슷하지만, 인자 부분이 다르죠? 

grep 함수는 탐색할 대상을 두 번째 인자에 넣어줍니다.


> library(stringr)

> v1 <- c('abc', 'abc1', 'Acacia', 'banana', 'carrot', 'Avocado')

# str_detect 함수는 TRUE or FALSE 리턴 

> str_detect(v1, 'ab')  

[1]  TRUE  TRUE FALSE FALSE FALSE FALSE

> v1[str_detect(v1, 'ab')]

[1] "abc"  "abc1"

# grep 함수는 패턴 위치를 리턴(동일한 결과)

> grep('ab', v1)

[1] 1 2

> v1[grep('ab', v1)]

[1] "abc"  "abc1"



> grep('ab', v1, value = T)    # 참고. value =T 옵션은 패턴에 해당되는 값을 직접 추출(색인을 하지 않아도 자동으로 값 출력)

[1] "abc"  "abc1"                  # 벡터 데이터 추출 시 주로 사용합니다. 



# v1에서 ab 또는 ba를 포함하는 값 출력(두 가지 패턴을 동시에 찾는 방법)

> v1

[1] "abc"     "abc1"    "Acacia"  "banana"  "carrot"  "Avocado"

> pattern <- c('ab', 'ba')

> grep(pattern, v1)    # pattern은 2개 이상의 값을 가질 수 없습니다.

[1] 1 2

Warning message:

In grep(pattern, v1) :

  argument 'pattern' has length > 1 and only the first element will be used

> grep('ab|ba', v1)    # ' | ' 연산자로 하나의 값으로 묶어서 전달(or 패턴 검사 가능)

[1] 1 2 4

> grep(paste(pattern, collapse = '|'), v1, value = T)

[1] "abc"    "abc1"   "banana"



> v1

[1] "abc"     "abc1"    "Acacia"  "banana"  "carrot"  "Avocado"

> grep('^c',v1,value=T) # c로 시작하는 단어 찾기

[1] "carrot"

> grep('a$',v1,value=T) # a로 끝나는 단어 찾기

[1] "Acacia" "banana"

> grep('[1-9]',v1,value=T) # 숫자가 포함된 단어 찾기

[1] "abc1"

> grep('[[:upper:]]',v1,value=T) # 대문자가 포함된 단어 찾기

[1] "Acacia"  "Avocado"




 2. nchar() 함수 : 원소의 크기 리턴


nchar() 함수는 str_length() 함수와 유사합니다.


> v1

[1] "abc"     "abc1"    "Acacia"  "banana"  "carrot"  "Avocado"

> nchar(v1)

[1] 3 4 6 6 6 7

> nchar('배고파')

[1] 3




 3. paste() 함수 : 문자열 결합


paste() 함수는 str_c() 함수와 유사합니다.


# 나열된 문자들의 결합 

> paste('a', 'b', 'c')   # paste함수에 나열된 문자들을 하나로 결합

[1] "a b c"

# 결합 시 구분기호는 공백(default)

> paste('a', 'b', 'c', sep='')    # 공백 제거

[1] "abc"

> paste('a', 'b', 'c', sep='/')   # 구분기호 지정

[1] "a/b/c"

> paste('I','\'m', 'Aaron')     # 특수문자의 경우 \ 사용

[1] "I 'm Aaron"



# sep 옵션과 collapse 옵션의 차이점을 명확하게 알아야 합니다. 

# 나열된 문자들의 결합 

> paste('a', 'b', 'c', sep='|')         # sep은 분리되어진 각 문자의 구분 기호( | ) 지정 가능

[1] "a|b|c"

> paste('a', 'b', 'c', collapse='|')   # collapse는 분리되어진 각 문자의 구분 기호( | ) 지정  

[1] "a b c"

> # 벡터 데이터의 결합 

> vv1 <- c('a', 'b', 'c')

> paste(vv1, sep='|')                 # sep은 벡터 내 원소의 구분 기호( | ) 지정 불가

[1] "a" "b" "c"

> paste(vv1, collapse ='|')         # collapse는 벡터 내 원소의  구분 기호( | ) 지정 가능 

[1] "a|b|c"


결론으로, 

sep 옵션나열된 문자들결합 구분 기호로 결합하고 싶을 때 사용하고,

collapse 옵션벡터 내 요소들을 구분 기호로 결합하고 싶을 때 사용합니다. 




 4. substr() 함수 : 문자열 추출


substr(문자열, 시작위치, 끝나는 위치 ) 


> substr('i\'m hungry',3,3)

[1] "m"

> substr('i\'m hungry',5,10)

[1] "hungry"




5. strsplit() 함수 : 문자열 분리


strsplit(문자열, split = 기준문자) 


> strsplit('2019/01/02', split = '/')

[[1]]

[1] "2019" "01"   "02"  




6. regexpre() 함수 : 정규식 표현을 사용한 패턴 검색


regexpre(패턴, 문자열) 


> regexpr( ',', '100,000,000' )    # 처음으로 나오는 패턴의 위치 출력

[1] 4

attr(,"match.length")

[1] 1

attr(,"index.type")

[1] "chars"

attr(,"useBytes")

[1] TRUE

# grep() 함수로는 문자열의 위치를 찾을 수 없습니다. 

> grep(',','100,000,000')      

[1] 1                                  # 출력되는 1은 패턴이 포함된 '1'번째 문자열을 의미

> grep(',',c('100,000', '10', '100', '100,000'))

[1] 1 4                               # '1', '4' 번째 문자열에 특정 패턴이 있다는 의미



Q.

# 1. emp 데이터를 사용, 사원번호가 79로 시작하는 직원의 연봉(SAL + COMM) 평균을 구하여라

> emp

   EMPNO  ENAME       JOB  MGR        HIREDATE  SAL COMM DEPTNO

1   7369  SMITH     CLERK 7902 1980-12-17 0:00  800   NA     20

2   7499  ALLEN  SALESMAN 7698 1981-02-20 0:00 1600  300     30

...

13  7902   FORD   ANALYST 7566 1981-12-03 0:00 3000   NA     20

14  7934 MILLER     CLERK 7782 1982-01-23 0:00 1300   NA     10

> sal_79 <- emp[grep('^79', emp$EMPNO), c("SAL","COMM")]      # 색인에서 연산 불가(추출만 가능)

> mean(sal_79$SAL + ifelse(is.na(sal_79$COMM),0,sal_79$COMM)) # mean 함수는 벡터 내의 원소들끼리의 평균을 구해주도록 설계

[1] 1750



# 2. professor 데이터를 사용, ID에 특수문자가 포함되어 있는 직원의 이름과 id 출력

> professor <- read.csv("professor.csv", stringsAsFactors = F)

> professor

   PROFNO   NAME         ID POSITION PAY            HIREDATE BONUS DEPTNO                EMAIL                 HPAGE

1    1001 조인형    captain   정교수 550 1980/06/23 00:00:00   100    101      captain@abc.net    http://www.abc.net

2    1002 박승곤     sweety   조교수 380 1987/01/30 00:00:00    60    101       sweety@abc.net    http://www.abc.net

...                    

15   4006   전민   napeople 전임강사 220 2010/06/28 00:00:00    NA    301    napeople@jass.com                      

16   4007   허은 silver-her   조교수 290 2001/05/23 00:00:00    30    301  silver-her@daum.net                      

> professor[grep('[[:punct:]]',professor$ID),c("NAME","ID")]

     NAME         ID

9  김현정     only-u

16   허은 silver-her



# 3. 특수문자가 포함된 ID의 특수문자 제거

> library(stringr)

> professor$ID <- str_replace_all(professor$ID, '[[:punct:]]', '')

> professor$ID

 [1] "captain"    "sweety"     "powerman"   "lamb1"      "number1"    "bluedragon" "angel1004"  "naone10"    "onlyu"     

[10] "simson"     "gogogo"     "mypride"    "ironman"    "standkang"  "napeople"   "silverher" 






참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정

반응형

'R > Process' 카테고리의 다른 글

[R] 함수의 정의  (0) 2019.01.02
[R] 연산  (0) 2019.01.02
[R] 문자열 관련 함수 - stringr 패키지, 정규식  (1) 2019.01.01
[R] 반복문 - for, while, next, repeat, exit, break  (2) 2019.01.01
[R] 조건문 - if, else if, ifelse  (0) 2018.12.31
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday