R: fastest way to extract all substrings contained between two substrings

r, regex, string, substring

Solution

For something simple like this, base R handles this just fine.

You can switch on PCRE by using `perl=T` and use lookaround assertions.

x <- 'strt111stpblablastrt222stp'
regmatches(x, gregexpr('(?<=strt).*?(?=stp)', x, perl=T))[[1]]
# [1] "111" "222"

Explanation:

(?<=          # look behind to see if there is:
  strt        #   'strt'
)             # end of look-behind
.*?           # any character except \n (0 or more times)
(?=           # look ahead to see if there is:
  stp         #   'stp'
)             # end of look-ahead

EDIT: Updated below answers according to the new syntax.

You may also consider using the stringi package.

library(stringi)
x <- 'strt111stpblablastrt222stp'
stri_extract_all_regex(x, '(?<=strt).*?(?=stp)')[[1]]
# [1] "111" "222"

And `rm_between` from the qdapRegex package.

library(qdapRegex)
x <- 'strt111stpblablastrt222stp'
rm_between(x, 'strt', 'stp', extract=TRUE)[[1]]
# [1] "111" "222"

Problem

I am on the lookout for an efficient way to extract all matches between two substrings in a character string. E.g. say I want to extract all substrings contained between string ``` start="strt" ``` and ``` stop="stp" in string x="strt111stpblablastrt222stp" ``` I would like to get vector ``` "111" "222" ``` What is the most efficient way to do this in R? Using a regular expression perhaps? Or are there better ways?

Original source