当gregexpr工作正常时,Biostrings gregexpr2会出错

时间:2017-07-01 01:23:44

标签: r string pattern-matching bioconductor

我用gregexpr2替换gregexpr来检测重叠匹配。当我尝试。

>subSeq
 3000-letter "DNAString" instance
 seq: ACACGTGTTCTATTTTCATTTGCTGACATTTTCTAGTGCATCATTTTTTATTTTATTTTCATT....

gregexpr2("TAAT|ATTA",subSeq)

Error in matches[[i]] : subscript out of bounds

gregexpr("TAAT|ATTA",subSeq)

工作正常。

发生什么事了?

1 个答案:

答案 0 :(得分:1)

如果您阅读gregexpr2 documentation

,则非常清楚
  

这是标准gregexpr函数的替代品,仅执行精确匹配。标准gregexpr()在重叠时错过匹配。 gregexpr2函数查找所有匹配项,但它仅适用于“固定”模式,即精确匹配(不支持正则表达式)。

我把上面的相关句子加粗了。因此,您的gregexpr2会在输入中搜索TAAT|ATTA文本,并且由于没有管道,因此找不到匹配项。

如果您需要正则表达式重叠匹配,请使用 stringr 中的str_match_all

library(stringr)
> x <- "TAATTA"
> str_match_all(x, "(?=(TAAT|ATTA))")
[[1]]
     [,1] [,2]  
[1,] ""   "TAAT"
[2,] ""   "ATTA"

str_match_all函数保留所有捕获组值(与(...)模式部分匹配),因此您将收集由于在正向前端内使用的捕获组而导致的所有重叠匹配(即允许正则表达式引擎在字符串内的每个位置触发模式的非消费模式。)

模式详情

  • (?= - 在字符串内的每个位置触发的非消耗positive lookahead的开始
    • ( - 开始捕获组
      • TAAT - TAAT substring
      • | - 或
      • ATTA - ATTA substring
    • ) - 捕获组的结束
  • ) - 积极前瞻的结束。