2013-04-23 42 views
7

Có phương pháp hiệu quả hơn không? Làm thế nào tôi có thể làm điều này mà không cần stringr?Trích xuất tất cả các từ giữa hai từ cụ thể trong một vector ký tự

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" 

Trả lời

12

Đây là một cách tiếp cận tôi sử dụng trong qdap:

Sử dụng 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 " 

Nếu không có một add on gói:

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

Cảm ơn, tôi nghĩ bạn sẽ có cái gì đó như thế này lên tay áo của bạn! – Ben

+0

Tôi có thể hỏi, ngoài sự tò mò, bạn đang sử dụng cái gì mà xuất ra '##' trước mỗi dòng? Tôi thấy rằng một chút ở đây tại SO nhưng không có ý tưởng những gì sản xuất nó. – Ben

+0

Tôi có một chức năng tự làm trong .Rprofile của tôi để chèn '##' ở phía trước đầu ra và sao chép vào clipboard. –

1

Đây là một khó khăn thử sử dụng strsplit, mặc dù nó có thể được tinh chỉnh thêm:

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

#[1] " and "    " goes with "   " is a long way from " 
Các vấn đề liên quan