2016-08-22 2 views
10

두 개의 알려진 부분 문자열 사이에 나타나는 알 수없는 부분 문자열 (아무것도 될 수 있음)을 추출하는 간단한 방법을 찾으려고합니다. 나는 (흰색 공백없이) STR1 및 STR2 사이에있는 문자열 GET_ME을 추출해야다른 두 문자열 사이의 문자열 추출 R

a<-" anything goes here, STR1 GET_ME STR2, anything goes here"

예를 들어, 내가 문자열을 가지고있다.

나는 str_extract(a, "STR1 (.+) STR2")을 노력하고 있어요,하지만 난 물론 내가 필요한 문자열을 분리, 알려진 문자열을 제거 할 수있는 전체 경기를

[1] "STR1 GET_ME STR2" 

을 얻고있다,하지만 난 할 수있는 청소기 방법이 있어야한다고 생각합니다 올바른 정규식을 사용하여.

+0

사용 [이 (https://gist.github.com/MrFlick/10413321) 훌륭한 기능 '을 regcapturedmatches (test, gregexpr ('STR1 (. +?) STR2', 테스트, perl = TRUE)) ' – rawr

답변

18

str_match에는 STR1 (.*?) STR2을 사용할 수 있습니다. 여러 번있는 경우 str_match_all을 사용하십시오.

> library(stringr) 
> a<-" anything goes here, STR1 GET_ME STR2, anything goes here" 
> res <- str_match(a, "STR1 (.*?) STR2") 
> res[,2] 
[1] "GET_ME" 

베이스 R regexec를 사용하는 또 다른 방법 (제 매치 도착)

> test = " anything goes here, STR1 GET_ME STR2, anything goes here STR1 GET_ME2 STR2" 
> pattern="STR1 (.*?) STR2" 
> result <- regmatches(test,regexec(pattern,test)) 
> result[[1]][2] 
[1] "GET_ME" 
+0

작동합니다! 물음표의 목적은 무엇입니까? 그것없이 잘 작동하는 것 같습니다. – Sasha

+0

'? '는 * lazy * (greedy가 아님) 한정 기호의 일부입니다. '*'는 최대한 많이 일치하지만 가능한 한 적은 수의 문자와 일치합니다. 그래서, 'STR1. *? STR2' 정규 표현식은'STR1 xx STR2'와 일치하고'STR1. * STR2'는'STR1 xx STR2 zzz STR2'와 일치합니다. 입력 내용에 일치하는 항목이 여러 개있을 것으로 예상되는 경우 여기에 게으른 한정 기호를 사용해야합니다. 또한 FYI :'STR1'과'STR2' 사이에있는 문자열의 일부가 개행을 포함하고 있다면'(? s)':''(? s) STRING (. *?) STR2 "' . –

관련 문제