从UCSC名称中提取坐标[关闭]

问题描述 投票:-1回答:1

我有一个字符串:

hg38_ct_tbrefGene_6787_NM_000029_1_range = CHR1:230709995-230710853_5'pad = 0_3'pad = 0_strand = -_ repeatMasking =无

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

另外,关于这类问题的模式匹配cheatsheet / book / blog的建议会很棒!谢谢!

r regex gsub
1个回答
2
投票

您可以为此目的使用正则表达式和捕获组。有关更多信息,只需在网络上搜索“正则表达式”或“正则表达式”,您将找到几个网站,指导您如何设置灵活的搜索和提取模式。下面的字符串提取工作如下(我假设坐标总是在单词范围之前)。作为gsub的替代品,您也可以使用stri_extract包中的stringi

搜索捕获组(括号内的内容): (^.*)字符串的开头后跟任意字符零次或多次 (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"
© www.soinside.com 2019 - 2024. All rights reserved.