从 UCSC 名称中提取坐标

Extract coordinates form UCSC names

我有一个像这样的字符串:

hg38_ct_tbrefGene_6787_NM_000029_1_range=chr1:230709995-230710853_5'pad=0_3'pad=0_strand=-_repeatMasking=none

我想提取坐标,在上面的例子中:230709995 和 230710853。我不得不提一下,字符串的前一部分并不总是相同的长度。我想 gsub 是最好的选择,但我无法设法得到它们(太多的“_”)。

此外,对于这种问题,模式匹配cheatsheet/book/blog的建议会很棒! 谢谢!

您可以为此目的使用正则表达式和捕获组。如需更多信息,只需在网络上搜索 "regex" 或 "regular expression",您会发现多个站点将指导您如何设置灵活的搜索和提取模式。下面的字符串提取工作如下(我假设坐标总是以 range 这个词开头)。作为 gsub 的替代品,您也可以使用 stringi 包中的 stri_extract

搜索捕获组(括号内的内容):
(^.*) 字符串开头后跟任何字符零次或多次
(range.*:) range 后跟任意字符零次或多次后跟冒号 :
(\d+)一位或多位
(\D) 一个非数字字符
(\d+)一位或多位
(.*$) 任何字符出现零次或多次直到字符串结束

摘录:
\3 捕获第 3 组,即第一个 (\d+)
\5 捕获组 5,即第二个 (\d+)

string <- "hg38_ct_tbrefGene_6787_NM_000029_1_range=chr1:230709995-230710853_5'pad=0_3'pad=0_strand=-_repeatMasking=none"

strsplit(gsub("(^.*)(range.*:)(\d+)(\D)(\d+)(.*$)", "\3 \5", string , perl = TRUE), " ")
# [[1]]
# [1] "230709995" "230710853"