多个不匹配的 [点 (.)] 搜索模式

发布于 2024-12-15 21:24:12 字数 354 浏览 0 评论 0原文

多个不匹配的语法是什么,即。 Perl 中的点运算符 (.)? 我需要将 DNA 序列与目标序列进行匹配,允许 3 个不匹配。 其语法是什么?

例如,设DNA序列ATGC,目标序列为ATGAGCA。匹配后,我的结果应该如下所示:

position no :          pattern
  1                    A...
  1                    .T..
  1                    ..G.
  3                    ..G.
  3                    ...C
  4                    A...

What is the syntax for more than one mismatch ie. dot operator (.) in Perl?
I need to match DNA sequence with target sequence with 3 mismatch allowed.
What will be syntax for that?

For example let DNA sequence ATGC and target sequence is ATGAGCA. After matching, my result should be like below:

position no :          pattern
  1                    A...
  1                    .T..
  1                    ..G.
  3                    ..G.
  3                    ...C
  4                    A...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

策马西风 2024-12-22 21:24:12

对于您在模式中显示的内容,您需要 .{3}​​ 来表示“最多 3”个匹配项,您需要 .{,3},其中 {< /code>n,m} 是一个“量词”,指定至少 n 匹配,但不超过 m。如果省略数字,则默认为 0 或无限制。

要将 ATGCATGAGCA 匹配,我想您可能需要 /(?:A[^T]{,3}T[^G]{,3} G[^C]{,3}C)+/ 并且由于这是非常规则的,因此您可以这样编写此表达式:

sub make_match_regex { 
    my ( $fc, @ch ) = split //, shift;
    my $cat = join( '', $fc, map { "[^$_]{,3}$_" } @chars );
    return qr/(?:$cat)+/;
}

For what you show in your patterns, you want .{3} for "up to 3" matches you would want .{,3}, where {n,m} is a "quantifier" specifying at least n matches, but no more than m. If you omit a number, it defaults to either 0 or unlimited.

To match ATGC to ATGAGCA, I think you might want /(?:A[^T]{,3}T[^G]{,3}G[^C]{,3}C)+/ and since this is so regular, you could make this expression this way:

sub make_match_regex { 
    my ( $fc, @ch ) = split //, shift;
    my $cat = join( '', $fc, map { "[^$_]{,3}$_" } @chars );
    return qr/(?:$cat)+/;
}
若相惜即相离 2024-12-22 21:24:12

检查此代码

use warnings;
use strict;

my $DNA_seq = "ATGC";
my $target_sequence = "ATGAGCA";

my  @tseq = split(//,$target_sequence);
print "position pattern\n";

#4 is the length of the DNA sequence
for(my $i=0; $i<=@tseq-4;$i++) {
  my $str = join('',@tseq[$i..$i+3]);
  foreach my $pattern qw(A... .T.. ..G. ...C) {
    if($str =~ /$pattern/) {
      my $position = $i+1;
      print "$position $pattern\n";
    }
  }
}

输出是

position pattern
1 A...
1 .T..
1 ..G.
3 ..G.
3 ...C
4 A...

Check this code

use warnings;
use strict;

my $DNA_seq = "ATGC";
my $target_sequence = "ATGAGCA";

my  @tseq = split(//,$target_sequence);
print "position pattern\n";

#4 is the length of the DNA sequence
for(my $i=0; $i<=@tseq-4;$i++) {
  my $str = join('',@tseq[$i..$i+3]);
  foreach my $pattern qw(A... .T.. ..G. ...C) {
    if($str =~ /$pattern/) {
      my $position = $i+1;
      print "$position $pattern\n";
    }
  }
}

Output is

position pattern
1 A...
1 .T..
1 ..G.
3 ..G.
3 ...C
4 A...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文