如何在R中的某些字符集之前和之后提取所有字符,同时确保字符串中的第一个/最后一个字符?

时间:2018-01-22 14:38:58

标签: r pattern-matching stringr stringi

我有一个很长的字符串:

my_string = "GTCAGTCGATCTGGGCATTATGCGTCAAAAGGCTGCTAGCTAAAGCTGATCAGCATCAAAAGGCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAGGTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAGGTCAGTCAGTCA"

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

  1. "之前的一切" 第一次遇到CAAAAG
  2. "之后的一切" 最后遇到了TGGGCATT
  3. CAAAAG之前的所有内容都可以这样找到:

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

    但我如何确保它是"首先" CAAAAG在字符串中?我收到的所有字符都是在第一个 CAAAAG之前找到的

    TGGGCATT也是如此。我可以收到一切"" TGGGCATT就是这样:

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

    但是我怎样才能确保我在#34;之后得到所有角色?我的字符串中的最后 TGGGCATT?

2 个答案:

答案 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"