在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中提取子字符串最多为双下划线的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 中提取子字符串

从给定字符串中提取子字符串

使用 grepl 在 R 中提取子字符串

如何在R中使用for循环提取多个子字符串

使用R从文本中提取子字符串[重复]

R语言str_sub函数从字符串中提取或替换子字符串(substring):str_sub函数指定起始位置和终止位置抽取子字符str_sub函数指定起始位置和终止位置替换子字符串