gpt4 book ai didi

javascript - 正则表达式:匹配 DNA 序列的排列

转载 作者:数据小太阳 更新时间:2023-10-29 06:15:18 26 4
gpt4 key购买 nike

如何制作正则表达式来评估以下字符串?

TGATGCCGTCCCCTCAACTTGAGTGCTCCTAATGCGTTGC

并提取模式CTCCT。

模式必须是 3 个 C 和 2 个 T,顺序不限。

我试过/[C | T]{5}/但它匹配 CCCCT 和 TCCCC

提前致谢。

最佳答案

计算“CTCCT”的所有排列并将它们连接到正则表达式:

CCCTT|CCTCT|CCTTC|CTCCT|CTCTC|CTTCC|TCCCT|TCCTC|TCTCC|TTCCC

这个模式可以是optimized :

C(?:C(?:T(?:CT|TC)|CTT)|T(?:C(?:CT|TC)|TCC))|T(?:C(?:C(?:CT|TC)|TCC)|TCCC)

var regex = new RegExp(/C(?:C(?:T(?:CT|TC)|CTT)|T(?:C(?:CT|TC)|TCC))|T(?:C(?:C(?:CT|TC)|TCC)|TCCC)/g);

var string = "TGATGCCGTCCCCTCAACTTGAGTGCTCCTAATGCGTTGC";

console.log(regex.exec(string));

此模式未找到重叠匹配项,例如。 G。 CCCTTCCC 中只有一个匹配项。

要查找重叠的匹配项,请使用前瞻:

C(?=C(?=T(?=CT|TC)|CTT)|T(?=C(?=CT|TC)|TCC))|T(?=C(?=C(?=CT|TC)|TCC)|TCCC)

var regex = new RegExp(/C(?=C(?=T(?=CT|TC)|CTT)|T(?=C(?=CT|TC)|TCC))|T(?=C(?=C(?=CT|TC)|TCC)|TCCC)/g);

var string = "CCCTTCCC";

while ((match = regex.exec(string)) != null) {
console.log(match.index, string.substring(match.index, match.index + 5));
}

正则表达式只能处理数量相当有限的排列。如果您想匹配可能任意大小的段,请使用非正则表达式解决方案:

function c3t2_optimized(str) {
var c = 0, t = 0;
for (var i = 0; i < str.length; ++i) {
var last = str.charAt(i);
if (last == 'C') ++c;
else if (last == 'T') ++t;
if (i > 4) {
var first = str.charAt(i - 5);
if (first == 'C') --c;
else if (first == 'T') --t;
}
if (c == 3 && t == 2) return i - 4;
}
return -1;
}

var string = "TGATGCCGTCCCCTCAACTTGAGTGCTCCTAATGCGTTGC";

console.log(c3t2_optimized(string));

或者和上面一样,就像一个生成器遍历所有可能重叠的匹配:

function* c3t2_optimized(str) {
var c = 0, t = 0;
for (var i = 0; i < str.length; ++i) {
var last = str.charAt(i);
if (last == 'C') ++c;
else if (last == 'T') ++t;
if (i > 4) {
var first = str.charAt(i - 5);
if (first == 'C') --c;
else if (first == 'T') --t;
}
if (c == 3 && t == 2) yield i - 4;
}
}

var string = "CCCTTCCC";

for (i of c3t2_optimized(string)) {
console.log(i, string.substring(i, i + 5));
}

性能比较: https://jsfiddle.net/24qguege/7/

火狐 47:

  • 68.83ms - 正则表达式(见上文)
  • 97.51ms - 非正则表达式(见上文)
  • 9582.39ms - Andrew Rueckert's answer (更好的可读性)

关于javascript - 正则表达式:匹配 DNA 序列的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37824193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com