匹配 DNA 重叠的正则表达式

Match regex with overlap for DNA

我正在尝试匹配从开头或开头的 3 个字母的倍数开始的 DNA 序列,并以 ATG 或 CGA 开头,然后是 6,9,12,15,... 字母和以 AGT 结尾。以下代码仅获取其中一个匹配项(最长的一个)。我已经研究过“正面前瞻”(例如?=),但无法弄清楚如何成功地将其应用于这种情况。

dna=c("ABCATGABCGAAADFAGTAAAAGTAGTAAAGT")
str_match_all(dna, "^(...)*((?:ATG|CGA)(?:...){2,}(?:AGT))")

[[1]]
     [,1]                          [,2]  [,3]      
[1,] "ABCATGABCGAAADFAGTAAAAGTAGT" "ABC" "ATGABCGAAADFAGTAAAAGTAGT"

Desired:
ABCATGABCGAAADFAGT ABC ATGABCGAAADFAGT
ABCATGABGCGAADFAGTAAAAGT ABC ATGABGCGAADFAGTAAAAGT
ABCATGABGCGAADFAGTAAAAGTAGT ABC ATGABGCGAADFAGTAAAAGTAGT

我知道您正在寻找正则表达式,但如果您 编程出来:

  • 使用贪婪的正则表达式 .{3} 将字符串拆分为三元组。
  • 找到开始和停止的位置,
  • 创建所有可能的组合,
  • 过滤开始后停止的组合
  • 取原字符串的片段
dna <- c("ABCATGABCGAAADFAGTAAAAGTAGTAAAGT")
triplets <- str_extract_all(dna, ".{3}")[[1]]
tidyr::expand_grid(
  start = which(triplets %in% c("ATG", "CGA")),
  stop = which(triplets == "AGT")
) %>%
  dplyr::filter(start < stop) %>%
  dplyr::mutate(fragment = stringr::str_sub(dna, 3*(start-1) + 1, 3*stop))
# A tibble: 3 x 3
  start  stop fragment                
  <int> <int> <chr>                   
1     2     6 ATGABCGAAADFAGT         
2     2     8 ATGABCGAAADFAGTAAAAGT   
3     2     9 ATGABCGAAADFAGTAAAAGTAGT