我用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)
工作正常。
发生什么事了?
答案 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 )
- 捕获组的结束)
- 积极前瞻的结束。