我有一个很长的字符串:
my_string = "GTCAGTCGATCTGGGCATTATGCGTCAAAAGGCTGCTAGCTAAAGCTGATCAGCATCAAAAGGCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAGGTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAGGTCAGTCAGTCA"
我想从这个字符串中提取两件事:
CAAAAG之前的所有内容都可以这样找到:
stringr::word(my_string, 1, sep = "CAAAAG")
但我如何确保它是"首先" CAAAAG在字符串中?我收到的所有字符都是在第一个 CAAAAG之前找到的?
TGGGCATT也是如此。我可以收到一切"" TGGGCATT就是这样:
stringr::word(my_string, -1, sep = "TGGGCATT")
但是我怎样才能确保我在#34;之后得到所有角色?我的字符串中的最后 TGGGCATT?
答案 0 :(得分:0)
我认为我有两种方法可供每种方式使用。
my_string = "GTCAGTCGATCTGGGCATTATGCGTCAAAAGGCTGCTAGCTAAAGCTGATCAGCATCAAAAGGCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAGGTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAGGTCAGTCAGTCA"
library(stringr)
str_match_all(my_string, '(.*?)CAAAAG')
#[[1]]
# [,1]
#[1,] "GTCAGTCGATCTGGGCATTATGCGTCAAAAG"
#[2,] "GCTGCTAGCTAAAGCTGATCAGCATCAAAAG"
#[3,] #"GCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAG"
#[4,] "GTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAG"
# [,2]
#[1,] "GTCAGTCGATCTGGGCATTATGCGT"
#[2,] "GCTGCTAGCTAAAGCTGATCAGCAT"
#[3,] "GCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCA"
#[4,] "GTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCA"
first.match <- str_match_all(my_string, '(.*?)CAAAAG')[[1]][1,2]
first.match
#[1] "GTCAGTCGATCTGGGCATTATGCGT"
str_locate_all(my_string, 'TGGGCATT')
#[[1]]
# start end
#[1,] 12 19
#[2,] 106 113
#[3,] 175 182
second.match.index <- str_locate_all(my_string, 'TGGGCATT')[[1]]
second.match <- substr(my_string,second.match.index[nrow(second.match.index),ncol(second.match.index)]+1,
nchar(my_string))
second.match
#[1] "TACAGTCAGTCACAAAAGGTCAGTCAGTCA"
修改:已添加&#39; + 1&#39;因为你想要下一个索引,而不是搜索到的字符串结束的索引。
答案 1 :(得分:0)
首先,检查发生次数:
gregexpr('CAAAAG', my_string)
[[1]]
[1] 26 57 134 194
attr(,"match.length")
[1] 6 6 6 6
attr(,"useBytes")
[1] TRUE
gregexpr('TGGGCATT', my_string)
[[1]]
[1] 12 106 175
attr(,"match.length")
[1] 8 8 8
attr(,"useBytes")
[1] TRUE
现在你可以仔细检查这对表达式是否返回相同的字符:
# Before first occurence of CAAAAG
stringr::word(my_string, 1, sep = "CAAAAG")
substr(my_string, 0, 26 - 1) # 26 first occurrence
# After last occurrence of TGGGCATT
stringr::word(my_string, -1, sep = "TGGGCATT")
substr(my_string, 175 + 8, nchar(my_string)) # 175 last occurrence + lenght of 'TGGGCATT'
此外,您可以使用sub
和基础包中的正则表达式获得相同的结果:
# Before first occurence of CAAAAG
sub('CAAAAG.*$', '', my_string)
[1] "GTCAGTCGATCTGGGCATTATGCGT"
# After last occurrence of TGGGCATT
sub('.*TGGGCATT', '\\1', my_string)
[1] "ACAGTCAGTCACAAAAGGTCAGTCAGTCA"