如何提取 R 中特定字符集前后的所有字符,同时确保这些字符在字符串中为 first/last?

How to extract all characters before and after a certain set of characters in R while making sure those characters are first/last in the string?

我有一个长字符串:

my_string = "GTCAGTCGATCTGGGCATTATGCGTCAAAAGGCTGCTAGCTAAAGCTGATCAGCATCAAAAGGCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAGGTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAGGTCAGTCAGTCA"

我想从这个字符串中提取两件事:

  1. 之前第一次遇到CAAAAG
  2. 的一切
  3. 一切“afterlast 遇到 TGGGCATT

CAAAAG 之前的所有内容都可以这样找到:

stringr::word(my_string, 1, sep = "CAAAAG")

但是我如何确定字符串中的 "first" CAAAAG?而且我收到了在第一个 CAAAAG?

之前 找到的所有字符

TGGGCATT 也是如此。我可以通过这种方式收到所有 "after" TGGGCATT:

stringr::word(my_string, -1, sep = "TGGGCATT")

但是我如何确保我的字符串中的所有字符都来自 "after" LAST TGGGCATT?

我想我有两种方法,每种方法都用过。

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"

编辑:添加“+1”是因为您想要下一个索引,而不是搜索字符串结束的索引。

首先,检查出现次数:

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

现在你可以仔细检查这对表达式 return 相同的字符:

# 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"