11.1 패턴 찾기 함수
grep()
, grepl()
, regexpr()
, gregexpr()
및 regexec()
등과 같은 처음 5 개의 grep()-류의 함수를 살펴볼 것이다.
이 함수들의 목표는 일치하는 것을 찾는 것
으로 모두 같다.
이들의 차이점은 출력 형식이다.
기본적으로 이러한 함수에는 두 가지 주요 인수, 즉 패턴 (예 : 정규식)과 일치에 사용되는 텍스트가 필요하다.
이 함수들의 기본 사용법은 다음과 같다.
`grep(pattern, text)` : text내의 pattern의 위치 색인 값 (정수형)
`grepl(pattern, text)` : text 내 pattern의 일치 여부 (logical 형)
`regexpr(pattern, text)` : pattern과 일치하는 위치에 대한 자세한 정보 출력 (정수형)
`gregexpr(pattern, text)` : text의 각 개별 요소별로 pattern과 일치하는 자세한 위치 정보 출력 (list 형)
`regexec(pattern, text)` : text의 각 개별 요소별로 pattern과 일치하는 자세한 위치 정보 출력 (list 형)
각 함수에는 추가되는 또 다른 인수들이 있지만 잊지 말아야 할 중요한 인수는 패턴과 텍스트이다.
11.1.1 grep()
함수
grep()
함수는 문자열 벡터의 패턴을 일치시킬 수 있는 가장 기본적인 함수이다.
11.1.1.1 grep()
함수의 인수와 출력 :
- 첫 번째 인수는 일치시킬 패턴을 지정하는 정규 표현식입니다.
- 두 번째 인수는 검색 할 텍스트 문자열이 포함된 문자형 벡터이다.
- 출력은 디폴트로 일치하는 텍스트 벡터 요소의 색인 값이다. 일치하는 것이 없으면 출력은 빈 정수 벡터이다.
# some text
<- c("one word", "a sentence", "you and me", "three two one")
text
# pattern
<- "one"
pattern
# default usage
grep(pattern, text)
## [1] 1 4
- 출력에서 볼 수 있듯이
grep()
함수는 숫자 벡터를 반환한다. - 이는
text
벡터의 첫 번째와 네 번째 요소가 일치함을 나타낸다. 대조적으로, 두 번째와 세 번째 요소는 일치하지 않는 것이다.
11.1.1.2 인수 값을 사용하여 출력이 표시되는 방식을 수정할 수 있다.
- 색인을 반환하는 대신에,
value = TRUE
를 선택하면grep()
함수는 문자열 벡터의 내용(해당 요소의 값)을 반환한다.
# with 'value' (showing matched text)
grep(pattern, text, value = TRUE)
## [1] "one word" "three two one"
11.1.1.3 또 다른 재미있는 인수는 invert
이다.
- 이 매개 변수를 사용하여 값을
invert = TRUE
로 설정하면 일치하지 않는 문자열을 얻을 수 있다.
# with 'invert' (showing unmatched parts)
grep(pattern, text, invert = TRUE)
## [1] 2 3
# same with 'values'
grep(pattern, text, invert = TRUE, value = TRUE)
## [1] "a sentence" "you and me"
요약하면, grep()
함수를 사용하여 일치하는 패턴을 포함하거나, 포함하지 않는 요소만 가져 오기 위해, 문자형 벡터의 부분 집합을 구하는데 사용할 수 있는 것이다.
11.1.2 grepl()
함수
grepl()
함수를 사용하면 grep()
함수와 비슷한 작업을 수행할 수 있다.
차이점은 출력이 숫자 색인번호가 아니라 논리값 (TRUE
/FALSE
)이라는 점에 있다.
따라서 grepl()
함수를 ’grep-logical’로 생각할 수 있다.
앞의 예제와 동일한 텍스트 문자열을 사용하여 grepl()
함수를 살펴보면 다음과 같다.
# some text
<- c("one word", "a sentence", "you and me", "three two one")
text
# pattern
<- "one"
pattern
# default usage
grepl(pattern, text)
## [1] TRUE FALSE FALSE TRUE
문자형 벡터와 같은 길이의 논리형 벡터를 얻는다. 패턴과 일치하는 요소들은 TRUE
값을 갖는다. 패턴과 일치하지 않는 요소는 FALSE
값을 갖는다.
11.1.3 regexpr()
함수
주어진 문자열에서 패턴이 있는 요소의 위치를 정확히 찾으려면 regexpr()
함수를 사용할 수 있다.
이 함수는 grep()
보다 자세한 정보를 반환한다 :
- 텍스트 벡터의 어떤 요소가 실제로 정규 표현식 패턴을 포함하고 있는가
- 정규 표현식 패턴과 일치하는 부분 문자열의 위치를 확인한다.
# some text
<- c("one word", "a sentence", "you and me", "three two one")
text
# default usage
regexpr("one", text)
## [1] 1 -1 -1 11
## attr(,"match.length")
## [1] 3 -1 -1 3
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
- 언뜻 보면
regexpr()
함수의 출력이 약간 복잡해 보일 수도 있지만 해석하기는 매우 간단하다. - 출력에는 세 개의 요소가 표시된다.
- 첫 번째 요소는 첫 번째 일치의 시작 위치를 제공하는
text
의 길이(length)와 같은 요소 수를 갖는 정수 벡터이다.- 이 예에서 숫자
1
은 패턴 “one
”이text
의 첫 번째 요소(“one word
”) 에서1
의 위치에서 시작함을 나타낸다. - 음수 색인
-1
은 일치하는 항목이 없음(“a sentence
,” “you and me
”의 경우)을 나타낸다. - 숫자
11
은text
의 네 번째 요소(“three two one
”)에서 “one
”과 일치하는 부분 문자열의 위치를 나타낸다.
- 이 예에서 숫자
match.length
속성은text
의 각 요소에서 일치하는 길이(length)를 제공한다.-1
의 음수 값은 해당 요소에 일치하는 것이 없음을 의미한다.
- 마지막으로, 속성
useBytes
의 값은TRUE
이다. 이는 문자단위가 아니라 바이트 단위로 일치를 수행하는 것을 의미한다.
11.1.4 gregexpr()
함수
gregexpr()
함수는 regexpr()
함수와 실질적으로 동일한 기능을 수행한다.
문자열 벡터 text
의 각 요소를 개별적으로 검색하여 패턴이 문자열 벡터와 일치하는 위치를 확인해 준다.
유일한 차이점은 gregexpr()
함수는 list 형식으로 출력한다는 것이다.
다시 말해, gregexpr()
은 text
와 동일한 길이(요소 갯수)의 list를 반환한다. 각 요소는 regexpr()
함수의 반환 값과 형식이 동일하다. 단, 모든 일치(불일치)의 시작 위치도 제공한다.
# some text
<- c("one word", "a sentence", "you and me", "three two one")
text
# pattern
<- "one"
pattern
# default usage
gregexpr(pattern, text)
## [[1]]
## [1] 1
## attr(,"match.length")
## [1] 3
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
##
## [[2]]
## [1] -1
## attr(,"match.length")
## [1] -1
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
##
## [[3]]
## [1] -1
## attr(,"match.length")
## [1] -1
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
##
## [[4]]
## [1] 11
## attr(,"match.length")
## [1] 3
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
regexpr()
함수의 결과를
11.1.5 regexec()
함수
regexec()
함수는 출력이 text
와 길이가 같은 list라는 점에서 gregexpr()
에 매우 가깝다.
list의 각 요소는 일치의 시작 위치를 포함한다.
값이 -1
이면 일치하는 항목이 없음을 나타낸다.
또한 list의 각 요소에는 일치 길이를 제공하는 “match.length
” 속성이 있다(일치하지 않는 경우 -1):
# some text
<- c("one word", "a sentence", "you and me", "three two one")
text
# pattern
<- "one"
pat
# default usage
regexec(pat, text)
## [[1]]
## [1] 1
## attr(,"match.length")
## [1] 3
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
##
## [[2]]
## [1] -1
## attr(,"match.length")
## [1] -1
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
##
## [[3]]
## [1] -1
## attr(,"match.length")
## [1] -1
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
##
## [[4]]
## [1] 11
## attr(,"match.length")
## [1] 3
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
# handy function to extract matched term
<- regexpr(pattern, text)
x substring(text, x, x + attr(x, "match.length") - 1) # 부분 문자열 반환
## [1] "one" "" "" "one"
# with NA
regexpr(pattern, c(text, NA))
## [1] 1 -1 -1 11 NA
## attr(,"match.length")
## [1] 3 -1 -1 3 NA
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE