2014-04-07 8 views
6

stringr 패키지를 사용하여 두 개의 특정 패턴 사이에있는 문자열의 일부를 추출하려고합니다. 예를 들어두 개의 다른 패턴 사이에서 문자열의 일부를 추출하십시오.

, I는 가지고

my.string <- "nanaqwertybaba" 
left.border <- "nana" 
right.border <- "baba" 

및 I를 받고자 (패턴은 POSIX 정규식 의해 정의 이다) str_extract(string, pattern) 함수를 사용하여 :

"qwerty" 

Google의 솔루션이 작동하지 않았습니다.

답변

8

나는이 stringr에서 제공하는 기능을 수 있는지 여부와 방법을 알고하지 않습니다하지만 당신은 또한 기본 regexprsubstring을 사용할 수 있습니다 : 당신이 gsub을 사용할 수 있습니다

pattern <- paste0("(?<=", left.border, ")[a-z]+(?=", right.border, ")") 
# "(?<=nana)[a-z]+(?=baba)" 

rx <- regexpr(pattern, text=my.string, perl=TRUE) 
# [1] 5 
# attr(,"match.length") 
# [1] 6 

substring(my.string, rx, rx+attr(rx, "match.length")-1) 
# [1] "qwerty" 
+0

감사합니다. 나는 그것을 단지 약간 조정했다 : 1. 모든 문자를'left.border'와'right.border' 사이에 매치시키고, 2. 'right.border'의 첫 번째 일치를 맞추고, 이제 나는 : rx <- regexpr (paste0 ("(? <=", left.border ") (. *?) + (? =", right.border, ")") text = my.string, perl = TRUE) '. 큰 감사합니다! –

14

R base에서. pattern의 괄호는 번호가 지정된 캡처 그룹을 만듭니다. 여기서 우리는 replacement에서 두 번째 그룹, 즉 테두리 사이의 그룹을 선택합니다. .은 모든 문자와 일치합니다. *는 0 내가 stringr에서 str_match을 사용

gsub(pattern = "(.*nana)(.*)(baba.*)", 
    replacement = "\\2", 
    x = "xxxnanaRisnicebabayyy") 
# "Risnice" 
+0

글쎄, 핵심은 "쿼티 (qwerty)"가 여기에 앉아 있다는 것을 모르지만, 정규식 패턴에서 사용할 방법이없는 것입니다! –

+0

@Marciszka :이 예에서 'qwerty'를 정규식으로 바꿀 수 있습니다 (예 : 적어도 하나의 문자에 대해'gsub (pattern = "(. * nana) ([[alpha :]] +) (baba. *)", "\\ 2", x = my.string)' – sgibb

5

선행하는 요소의 이상이 있음을 의미 : "첫 경기에서 ()에 의해 형성된 캡처 그룹을 추출 str_match 그것은과 문자 행렬을 반환합니다. 완전한 일치를위한 1 개의 란 및 각 그룹을위한 1 개의 란. " ref

str_match(my.string, paste(left.border, '(.+)', right.border, sep=''))[,2] 

위 코드 paste 좌우 테두리 1 개 이상의 문자 (문자열 사이의 공백없이)를 캡쳐하는 캡쳐 (.+) 군을 연결하여 정규 표현을 생성한다.

단일 일치라고 가정합니다. 따라서 [,2]str_match이 반환 한 행렬에서 두 번째 열을 선택합니다.