Мы можем использовать sub
в базе R для захвата символов, которые идут после 19 или 20 и ;
, и заменить их обратной ссылкой (\\1
) захваченной группы
trimws(sub(".*\\b(19|20)([^;]+);.*", "\\2", str1))
#[1] "93 def ghi" "12 kff kkk" "99 ggg yyy" "15 tet mmm"
Или используя trimws
и whitespace
trimws(str1, whitespace = '.*(19|20)|;.*')
#[1] "93 def ghi" "12 kff kkk" "99 ggg yyy" "15 tet mmm"
Или с str_extract
library(stringr)
trimws(str_extract(str1, "(?<=\\b(19|20))[^;]+"))
#[1] "93 def ghi" "12 kff kkk" "99 ggg yyy" "15 tet mmm"
data
str1 <- c("abc 1993 def ghi; klm", "cba 2012 kff kkk; zzz", "xxx 1999 ggg yyy; vvv",
"cgc 2015 tet mmm; bbb")