R语言如何正确提取文件名中下划线之前的内容?
问题解答
首先说明你两种写法的错误原因:
- 第一种写法
strsplit(count_files, "_*"):正则中_*代表匹配0个或多个下划线,等效于按空字符拆分,会把所有字符逐个拆开,完全不符合需求。 - 第二种写法
strsplit(count_files, "_*.[c,t]sv"):正则逻辑存在多处错误:_*还是匹配0个或多个下划线,.匹配任意单字符,[c,t]sv实际匹配的是c/、/t开头加sv的字符组合,完全无法定位到第一个下划线的位置。
可行实现方案
方案1:base R 原生strsplit实现
直接按下划线拆分后,取每个拆分结果的第一个元素即可:
# 示例文件名列表 count_files <- c("group1_rep1.csv", "group2_rep2_3.csv", "sampleA_test.csv") # 拆分后取首个元素 condition <- sapply(strsplit(count_files, split = "_"), function(x) x[1])
方案2:base R 正则替换实现(更简洁)
用sub函数直接替换掉第一个下划线及之后的所有内容,剩下的就是目标内容:
condition <- sub("_.+$", "", count_files)
正则说明:_匹配第一个下划线,.+匹配任意数量的任意字符,$匹配字符串末尾,整体即匹配第一个下划线到结尾的全部内容,用空替换后就得到下划线前的内容。
方案3:stringr包函数实现(代码可读性更高)
如果允许使用第三方包,用str_extract直接匹配目标内容即可:
library(stringr) condition <- str_extract(count_files, "^[^_]+")
正则说明:^匹配字符串开头,[^_]+匹配1个及以上非下划线的字符,刚好对应第一个下划线之前的全部内容。
内容的提问来源于stack exchange,提问作者Madhav Makkena
相关产品推荐
相关产品推荐

