如何从R语言文件名字符串中提取指定数字与字符并拼接?
解决R语言字符串提取与拼接问题
方法一:基础R函数(无需正则)
因为你暂时没时间学正则,用基础R的字符串处理函数就能搞定,步骤清晰:
提取目标数字:
先把路径按/拆分,取第二个目录段(比如ABC19_XY_10001),再按_拆分后取最后一段就是数字:string <- c("2019data/ABC19_XY_10001/finit1/ABC19_XY_10001_FAST (1).csv", "2019data/ABC19_XY_2145/finit2/ABC19_XY_2154_GRABBER (1).csv") nums <- sapply(strsplit(string, "/"), function(x) { dir_segment <- x[2] tail(strsplit(dir_segment, "_")[[1]], 1) })提取末尾单词:
先取文件名,去掉.csv后缀和末尾的(1),再按_拆分取最后一段就是目标单词:words <- sapply(string, function(x) { fname <- basename(x) fname_no_ext <- sub("\\.csv$", "", fname) fname_clean <- sub(" \\(1\\)$", "", fname_no_ext) tail(strsplit(fname_clean, "_")[[1]], 1) })拼接结果:
result <- paste(nums, words, sep = "_") # 输出结果:"10001_FAST" "2145_GRABBER"
方法二:正则表达式(适合后续学习后使用)
等你学完正则后,可以用更简洁的写法,直接匹配并捕获两个目标部分:
library(stringr) matches <- str_match(string, ".*/ABC19_XY_(\\d+)/.*_([A-Za-z]+) \\(1\\)\\.csv") result <- paste(matches[,2], matches[,3], sep = "_")
这个正则的逻辑是:
.*ABC19_XY_(\\d+):捕获ABC19_XY_后面的数字.*_([A-Za-z]+) \\(1\\)\\.csv:捕获最后一个下划线后、(1).csv前的单词
内容的提问来源于stack exchange,提问作者ksinva
相关产品推荐
相关产品推荐

