我正在尝试对向量的元素进行子串,以仅将该部分保留在FIRST下划线之前。我是一个接受子串的新手,并没有完全理解所有的正则表达式。我接近答案,我可以得到我想删除的部分,但仍然没有看到如何得到相反的部分。任何有关正则表达式的帮助和/或解释都表示赞赏!
我的矢量看起来如下,在某些元素中有多个下划线
v = c("WL_Alk", "LQ_Frac_C_litter_origin", "MI_Nr_gat", "SED_C_N", "WL_CO2", "WL_S")
我想要的输出看起来像
v_short = c("WL", "LQ", "MI", "SED", "WL", "WL")
让我想要删除的部分的代码是sub("^[^_]*", "", v)
。我认为我必须用$ in regex做一些事情,因为sub("[_$]", "", v)
删除了第一个下划线,但是我无法删除它背后的部分。即使使用正则表达式帮助文件,我也不完全理解^,$和*的含义,所以对这些内容的解释也很感激!
答案 0 :(得分:2)
您可以使用
> v = c("WL_Alk", "LQ_Frac_C_litter_origin", "MI_Nr_gat", "SED_C_N", "WL_CO2", "WL_S")
> sub("_.*", "", v)
[1] "WL" "LQ" "MI" "SED" "WL" "WL"
"_.*"
模式匹配第一个_
和.*
匹配任意0个字符,直到字符串末尾贪婪(即一次抓取它们)。
使用 stringr str_extract
,您可以使用您的模式:
> library(stringr)
> v_short = str_extract(v, "^[^_]*")
> v_short
[1] "WL" "LQ" "MI" "SED" "WL" "WL"
^[^_]*
模式匹配字符串的开头和_
以外的0个或更多字符。
答案 1 :(得分:2)
如果我理解正确
gsub("(.*?)(_.*)","\\1",v, perl = TRUE)
说明:
(.*?)
第一个捕获组;
(_.*)
第二个捕获组;
\\1
返回第一个捕获组;
答案 2 :(得分:0)