我有一个字符串:
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的建议会很棒! 谢谢!
答案 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'
});