我正在尝试提取字符向量中的子字符串,直到双下划线,即"__";
例如,假设我有以下数据。表:
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