我需要有关提取下划线分隔的第三个元素的正则表达式的帮助。下划线的数量是可变的。我可以使用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)
您可以利用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)