在R中提取高达双下划线的子字符串



我正在尝试提取字符向量中的子字符串,直到双下划线,即&quot__"

例如,假设我有以下数据。表:

require(data.table)
Temp <- data.table(Name = paste0(c("Max_drawdown__","Expectancy__"),
"anything_else"))

目标输出如下:

Target_output <- c("Max_drawdown","Expectancy")

我可以使用strsplit实现这一点,如下所示:

Temp[,do.call(rbind,strsplit(Name,"__"))[,1]]

然而,我很想了解如何使用正则表达式来实现它。

我已经尝试从stringr包中使用"str_extract",如下所示:

require(stringr)
Temp[,str_extract(Name,"[^__]*")]

它在第一个"_"在";最大下拉量";我试图提取的前缀。

有人能帮我一个正则表达式的解决方案,并解释它背后的逻辑吗?

使用下面的正则表达式,您可以获得下面两个下划线之前的所有字符。[]是一个字符类,只定义允许的字符或不定义[^]允许的字符。[^__]并不意味着后面没有两个下划线。

^(.*)[_]{2}

您可以提取所有内容,直到双下划线。使用sub可以执行以下操作:

library(data.table)
Temp[, Name := sub('(.*?)__.*', '\1', Name)]
Temp
#           Name
#1: Max_drawdown
#2:   Expectancy

不需要贡献的包(stringr(,基本R可以做到。

提取双下划线前的字符串:

Temp[, Name := sub("(^.*)__.*$", "\1", Name)]
Temp
#           Name
#1: Max_drawdown
#2:   Expectancy

提取双下划线后的字符串:

Temp[, Name := sub("^.*__", "", Name)]
Temp
#            Name
#1: anything_else
#2: anything_else

最新更新