You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用正则表达式提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:44:10