如何使用正则表达式提取SRR开头的8位数字子串并设置为cov_stats的行名
解决从FileName提取SRR+8位数字作为行名的问题
我来帮你搞定这个正则匹配的问题!你的需求是从FileName列的字符串里提取以SRR开头且后跟8位数字的子串,作为cov_stats的行名,之前尝试的正则表达式存在语法和逻辑上的小问题,我来给你修正并解释清楚。
先分析你之前的尝试问题:
- 第一次的正则
^\./\SRR*_\stats.\txt:转义错误(\S是正则特殊字符,不是字面的字母S),而且*表示重复前一个字符0次或多次,无法精准匹配8位数字,同时路径和后缀的匹配逻辑也不对。 - 第二次的正则
^SRR[:digit:]*:你用gsub把匹配到的内容替换成空字符串,这完全搞反了逻辑——我们需要保留匹配到的部分,而不是删掉它。
正确的实现方法
方法1:使用基础R的gsub(无需额外包)
利用正则的捕获组功能,匹配整个文件名,只保留我们需要的部分:
# 提取SRR开头+8位数字的子串作为行名 rownames(cov_stats) <- gsub(".*/(SRR\\d{8})_stats\\.txt", "\\1", cov_stats[["FileName"]])
正则解释:
.*/:匹配到最后一个斜杠/之前的所有内容(也就是./stats/部分)(SRR\\d{8}):捕获我们需要的核心内容——SRR开头,加上\\d{8}表示精准匹配8位数字_stats\\.txt:匹配文件名的固定后缀部分\\1:引用第一个捕获组的内容,也就是我们捕获到的SRRxxxxxxx
方法2:使用stringr包的str_extract(更直观)
如果安装了stringr包,直接提取符合模式的子串会更简单:
library(stringr) # 直接提取所有符合SRR+8位数字的子串 rownames(cov_stats) <- str_extract(cov_stats[["FileName"]], "SRR\\d{8}")
这个方法不需要匹配整个字符串,str_extract会自动找到第一个符合SRR后跟8位数字的子串,完美满足你的需求。
验证效果
用你给出的FileName示例:
[1] "./stats/SRR18826803_stats.txt" "./stats/SRR18826804_stats.txt"
[3] "./stats/SRR18826805_stats.txt" "./stats/SRR18826806_stats.txt"
[5] "./stats/SRR18826807_stats.txt" "./stats/SRR18826808_stats.txt"
两种方法都会得到你期望的结果:
[1] "SRR18826803" "SRR18826804"
[3] "SRR18826805" "SRR18826806"
[5] "SRR18826807" "SRR18826808"
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

