如何使用正则表达式匹配子字符串?

How to I use regular expressions to match a substring?

我想更改 cov_stats 的行名,使其包含 FileName 列值的子字符串。我只想保留以“SRR”开头的字符串,后跟 8 位数字(例如,SRR18826803)。

cov_list <- list.files(path="./stats/", full.names=T) 
cov_stats <- rbindlist(sapply(cov_list, fread, simplify=F), use.names=T, idcol="FileName")
rownames(cov_stats) <- gsub("^\.\/\SRR*_\stats.\txt", "SRR*", cov_stats[["FileName"]])

第二次尝试

rownames(cov_stats) <- gsub("^SRR[:digit:]*", "", cov_stats[["FileName"]])

原始字符串

> cov_stats[["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"

你可以使用

rownames(cov_stats) <- sub("^\./stats/(SRR\d{8}).*", "\1", cov_stats[["FileName"]])

参见regex demo详情:

  • ^ - 字符串开头
  • \./stats/ - ./stats/ 字符串
  • (SRR\d{8}) - 第 1 组 (</code>):<code>SRR 字符串,然后是八位数字
  • .* - 字符串的其余部分直到结束。

请注意,使用 sub(而不是 gsub)是因为输入字符串中只有一个预期的替换操作(因为正则表达式匹配整个字符串)。

参见 R demo:

cov_stats <- c("./stats/SRR18826803_stats.txt", "./stats/SRR18826804_stats.txt", "./stats/SRR18826805_stats.txt", "./stats/SRR18826806_stats.txt", "./stats/SRR18826807_stats.txt")
sub("^\./stats/(SRR\d{8}).*", "\1", cov_stats)
## => [1] "SRR18826803" "SRR18826804" "SRR18826805" "SRR18826806" "SRR18826807"

等效提取stringr方法:

library(stringr)
rownames(cov_stats) <- str_extract(cov_stats[["FileName"]], "SRR\d{8}")

这对你有用吗?

library(stringr)

stringr::str_extract(cov_stats[["FileName"]], "SRR.{0,8}")