正则表达式匹配从字符串开头到第一个下划线的所有字符

时间:2016-04-06 10:23:27

标签: regex r substring

我正在尝试对向量的元素进行子串,以仅将该部分保留在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)删除了第一个下划线,但是我无法删除它背后的部分。即使使用正则表达式帮助文件,我也不完全理解^,$和*的含义,所以对这些内容的解释也很感激!

3 个答案:

答案 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)

有两种方法可以做到。

使用^[^_]+并在第一个_之前匹配字符串。 Regex101 Demo

OR

首先使用_选择\_.+$之后的部分并将其消除。 Regex101 Demo