匹配 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
我正在尝试匹配从开头或开头的 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