在字符串中搜索递归模式

时间:2013-02-21 19:42:00

标签: perl

使用Perl,我想搜索一串核苷酸(AGCT)的模式不少于和不超过三个核苷酸连续重复至少七次。我还需要将该组合保存为打印到文件以及总计数。

这三种核苷酸的模式在某种意义上是未知的,虽然只有64种可能的组合,但我们不知道哪种是重复组合。

关于如何解决这个问题,我有两条思路:

创建可能组合的列表,并在生成计数时进行检查。这似乎不可行,因为每三个核苷酸会产生匹配。它仍然无法解决连续匹配的问题。

或者检查前三个核苷酸与接下来的三个核苷酸是否匹配,检查接下来的三个核苷酸。如果不匹配,将读取框架移动到字符串中的第二个核苷酸并再次尝试搜索。

1 个答案:

答案 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

看起来不错。