R语言正则表达式提取文件名片段实现重命名的方法
R语言提取CEL文件名指定片段用于重命名
待处理示例数据
s <- c("(1) 1-B1-1_(miRNA-4_0).CEL", "(10) 1-NEC 4-1_(miRNA-4_0).CEL", "(11) 1-B5-1_(miRNA-4_0).CEL", "(12) 1-B5-2_(miRNA-4_0).CEL")
需求为提取每个文件名中,以1-起始、到下划线_前最后一位数字结束的片段,预期输出为1-B1-1、1-NEC 4-1、1-B5-1、1-B5-2,用于后续批量重命名。
实现方法
基础R实现(无需安装额外包)
直接调用内置sub()函数通过正则捕获替换即可:
rename_vec <- sub(".*(1-.*\\d)_.*", "\\1", s)
运行后rename_vec的输出完全符合预期:
[1] "1-B1-1" "1-NEC 4-1" "1-B5-1" "1-B5-2"
正则逻辑说明
.*:贪婪匹配目标片段前的所有冗余内容(开头括号+序号+空格部分),自动跳过所有非目标位置的1字符(1-.*\\d):捕获组,对应需要保留的内容:从1-开始,匹配所有字符直到下划线前的最后一位数字_.*:匹配下划线以及后续所有文件后缀内容\\1:将整段文件名替换为第一个捕获组的内容,即目标片段
stringr包实现(适配tidyverse工作流)
如果日常使用tidyverse生态处理数据,可以用str_extract()配合正向预查语法实现,逻辑更直观:
library(stringr) rename_vec <- str_extract(s, "1-.*(?=_)")
其中(?=_)是正向零宽断言,代表匹配到下划线前的位置即停止,返回结果和基础R写法完全一致。
提取完成后直接配合file.rename()函数即可完成批量重命名操作。
内容的提问来源于stack exchange,提问作者BerTu
相关产品推荐
相关产品推荐

