使用Perl,我想搜索一串核苷酸(AGCT)的模式不少于和不超过三个核苷酸连续重复至少七次。我还需要将该组合保存为打印到文件以及总计数。
这三种核苷酸的模式在某种意义上是未知的,虽然只有64种可能的组合,但我们不知道哪种是重复组合。
关于如何解决这个问题,我有两条思路:
创建可能组合的列表,并在生成计数时进行检查。这似乎不可行,因为每三个核苷酸会产生匹配。它仍然无法解决连续匹配的问题。
或者检查前三个核苷酸与接下来的三个核苷酸是否匹配,检查接下来的三个核苷酸。如果不匹配,将读取框架移动到字符串中的第二个核苷酸并再次尝试搜索。
答案 0 :(得分:3)
这个正则表达式应该做的伎俩:
/( ([ACGT]{3}) \2{6,} )/x
匹配ACGT的三个字符,然后至少再重复六次捕获$2
。整个匹配的字符串位于$1
,其长度是实际组的三倍:$n = length($1)/3
。
测试:
my $regex = qr/( ([ACGT]{3}) \2{6,} )/x;
"TACGACGACGACGACGACGACGACGT" =~ $regex;
printf "Matched %s exactly %d times\n", $2, length($1)/3;
输出:
Matched ACG exactly 8 times
看起来不错。