2013-04-23 12 views
7

Czy istnieje bardziej wydajna metoda? Jak mogę to zrobić bez stringr?Wyodrębnij wszystkie wyrazy między dwoma określonymi słowami w wektorze znakowym.

txt <- "I want to extract the words between this and that, this goes with that, this is a long way from that" 

library(stringr) 
w_start <- "this" 
w_end <- "that" 
pattern <- paste0(w_start, "(.*?)", w_end) 
wordsbetween <- unlist(str_extract_all(txt, pattern)) 
gsub("^\\s+|\\s+$", "", str_sub(wordsbetween, nchar(w_start)+1, -nchar(w_end)-1)) 
[1] "and"    "goes with"   "is a long way from" 

Odpowiedz

12

Jest to podejście używam w qdap:

Korzystanie qdap:

library(qdap) 
genXtract(txt, "this", "that") 

## > genXtract(txt, "this", "that") 
##   this : that1   this : that2   this : that3 
##    " and "   " goes with " " is a long way from " 

bez dodać na opakowaniu:

regmatches(txt, gregexpr("(?<=this).*?(?=that)", txt, perl=TRUE)) 

## > regmatches(txt, gregexpr("(?<=this).*?(?=that)", txt, perl=TRUE)) 
## [[1]] 
## [1] " and "    " goes with "   " is a long way from " 
+0

Dzięki, pomyślałem, że będziesz mieć coś takiego w rękawie! – Ben

+0

Czy mogę zapytać, z ciekawości, z czego korzystasz, wypisując '## 'przed każdą linią? Widzę to trochę w SO, ale nie mam pojęcia, co go produkuje. – Ben

+0

Mam funkcję domowej roboty w moim .Rprofile, aby wstawić '##' przed wyjściem i skopiować do schowka. –

1

Oto kolejny szorstki spróbuj użyć strsplit, choć prawdopodobnie można go dalej udoskonalić:

txtspl <- unlist(strsplit(gsub("[[:punct:]]","",txt),"this|that")) 
txtspl[txtspl!=" "][-1] 

#[1] " and "    " goes with "   " is a long way from " 
Powiązane problemy