【问题标题】: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?如何提取R中一组字符之前和之后的所有字符,同时确保这些字符在字符串中的第一个/最后一个?
【发布时间】:2018-01-22 14:38:57
【问题描述】:

我的字符串很长:

my_string = "GTCAGTCGATCTGGGCATTATGCGTCAAAAGGCTGCTAGCTAAAGCTGATCAGCATCAAAAGGCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAGGTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAGGTCAGTCAGTCA"

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

  1. 所有“之前第一次遇到 CAAAAG
  2. 所有“之后最后遇到 TGGGCATT

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

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

但是我如何确保它是字符串中的“第一个”CAAAAG?我收到了在第一个 CAAAAG 之前发现的所有字符?

TGGGCAT 也是如此。我可以通过这种方式在 TGGGCATT 之后收到所有内容:

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

但是如何确保所有字符都出现在字符串中的 LAST TGGGCATT“之后”?

【问题讨论】:

  • 你说的确保是什么意思?您可以获得CAAAAG 的第一个索引,然后是从0 开始的子字符串,长度为N,其中N 是CAAAAG 的索引。也为了在TGGGCATT之后获取东西,获取它的最后一个索引,来自N的子字符串,长度为L - 1 - (N + l),其中N是索引,l是单词的长度,L是字符串的长度。
  • 不能直接拆分字符串吗?
  • 我不知道 R 但获取字符串的第一个索引和最后一个索引是常用的方法。如果字符串不包含您要查找的单词,它们还会返回 -1

标签: r pattern-matching stringr stringi


【解决方案1】:

我想我有两种方法可以用于每种方法。

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”是因为您想要下一个索引,而不是搜索字符串结束的那个。

【讨论】:

    【解决方案2】:

    首先,检查出现次数:

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      相关资源
      最近更新 更多