从UCSC名称中提取坐标

时间:2017-12-20 09:36:36

标签: r regex gsub

我有一个字符串:

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的建议会很棒! 谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用正则表达式并捕获组来实现此目的。欲了解更多信息,只需在网上搜索" regex"或"正则表达"你会发现几个网站将指导你如何设置灵活的搜索和提取模式。下面的字符串提取工作如下(我假设坐标始终以单词 range 开头)。作为gsub的替代方案,您也可以使用stri_extract stringi包中的(^.*)

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

提取物:
(\\d+)捕获第3组,即第一个\\5 (\\d+)捕获第5组,即第二个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"

sendgrid.send({
  to: 'you@yourdomain.com',
  from: {
      email: 'example@example.com',
      name: 'Sender Name'
  },
  subject: 'Hello World',
  text: 'My first email through SendGrid'
});