如何使用正则表达式匹配子字符串?
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}")
我想更改 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}")