在R中提取子字符串最多为双下划线
Posted
技术标签:
【中文标题】在R中提取子字符串最多为双下划线【英文标题】:Extracting sub-string up to a double underscore in R 【发布时间】:2021-06-30 14:12:30 【问题描述】:我正在尝试提取字符向量中的子字符串,直到双下划线,即“__”
例如,假设我有以下data.table:
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,"[^__]*")]
在我试图提取的“Max_drawdown”前缀中的第一个“_”处卡住了。
有人可以帮我提供一个正则表达式解决方案并解释其背后的逻辑吗?
【问题讨论】:
【参考方案1】:使用以下正则表达式,您可以获得两个下划线之前的所有字符。 [] 是一个字符类,只定义允许的字符或 [^] 不允许的字符。 [^__] 不表示后面没有两个下划线。
^(.*)[_]2
【讨论】:
感谢安德烈的解释和解决方案。我还希望从输出中删除“”。使用您的代码,我有: Temp[,gsub("","",str_extract(Name,"^(.*)[]2"))] ...这将实现它。有没有更简单的方法使用正则表达式返回不包括“_”的子字符串?谢谢(不知道为什么上面加粗了我评论的一部分。这不是故意的!另外,gsub 的第一部分有双下划线,但由于某种原因它没有出现在评论中) @Phil 那么您需要在 R 中进行“正则替换”。那么正则表达式将是[_]1,2
。我不知道 R。在 php 中它看起来像这样:$string = preg_replace('/[_]1,2/', '', 'Max_drawdown__'); // Maxdrawdown
【参考方案2】:
您可以提取所有内容,直到双下划线。使用sub
,您可以这样做:
library(data.table)
Temp[, Name := sub('(.*?)__.*', '\\1', Name)]
Temp
# Name
#1: Max_drawdown
#2: Expectancy
【讨论】:
感谢 Ronak!【参考方案3】:不需要贡献包 (stringr
),base 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
【讨论】:
谢谢瑞。我实际上是在寻找子字符串的组成部分,直到双下划线(而不是字符串的“anything_else”部分)。但是,我可以使用您上面引用的正则表达式来提取子字符串的第一部分,然后可能使用 gsub 删除双下划线(请参阅对 Andre 的回复了解我所指的内容)。谢谢 @Phil 很抱歉造成误解,现在已更正,请参阅编辑。 感谢更新!以上是关于在R中提取子字符串最多为双下划线的主要内容,如果未能解决你的问题,请参考以下文章
R语言str_sub函数从字符串中提取或替换子字符串(substring):str_sub函数指定起始位置和终止位置抽取子字符str_sub函数指定起始位置和终止位置替换子字符串