使用stringr :: str_replace在分隔符处分割字符串

r.u*_*apr 1 regex r tidyverse

我需要有关提取下划线分隔的第三个元素的正则表达式的帮助。下划线的数量是可变的。我可以使用str_split来做到这一点,但是有没有办法使用str_replace获得与下面相同的结果?(期望的结果是x = AAAA, BBBB, CCCC, DDDD。如果可能,请使用来保持分组()。)

library(tidyverse)
library(stringr)

d <- enframe(c("asfe_01_AAAA_fses_feee",
               "asfe_87_BBBB_fses_feee",
               "99_fesf_CCCC_feee",
               "99_fesf_DDDD"),
             name = NULL, value = "txt")

d %>%
  mutate(x = str_replace(txt, "(.+)_(.+)_(.+)_*(.*)_*(.*)", "\\3"),
         want_strsplit = str_split(txt, "_", simplify = TRUE)[, 3])

#txt                    x     want_strsplit
#  <chr>                  <chr> <chr>        
#1 asfe_01_AAAA_fses_feee feee  AAAA         
#2 asfe_87_BBBB_fses_feee feee  BBBB         
#3 99_fesf_CCCC_feee      feee  CCCC         
#4 99_fesf_DDDD           DDDD  DDDD    
Run Code Online (Sandbox Code Playgroud)

jay*_*.sf 5

您可以利用strsplit更多一点。

mapply(`[`, strsplit(d$txt, "_"), 3)
# [1] "AAAA" "BBBB" "CCCC" "DDDD"
Run Code Online (Sandbox Code Playgroud)

对于整个事情:

splt <- strsplit(d$txt, "_")
cbind(d, x=mapply(`[`, splt, lengths(splt)), want_strsplit=mapply(`[`, splt, 3))
#                      txt    x want_strsplit
# 1 asfe_01_AAAA_fses_feee feee          AAAA
# 2 asfe_87_BBBB_fses_feee feee          BBBB
# 3      99_fesf_CCCC_feee feee          CCCC
# 4           99_fesf_DDDD DDDD          DDDD
Run Code Online (Sandbox Code Playgroud)