Более одного несоответствия [точка (.)] Шаблон поиска - PullRequest
0 голосов
/ 17 ноября 2011

Каков синтаксис для более чем одного несоответствия, т.е.точка оператора (.) в Perl?Мне нужно сопоставить последовательность ДНК с последовательностью-мишенью с разрешенным 3 несоответствием.Какой будет синтаксис для этого?

Например, пусть последовательность ДНК ATGC и последовательность-мишень - ATGAGCA.После сопоставления мой результат должен выглядеть примерно так:

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

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

Проверьте этот код

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...
0 голосов
/ 17 ноября 2011

Для того, что вы показываете в своих шаблонах, вы хотите .{3} для "до 3" матчей, которые вы хотели бы .{,3}, где { n , m } - это «квантификатор», задающий не менее n совпадений, но не более m . Если вы опустите число, по умолчанию оно равно 0 или не ограничено.

Чтобы сопоставить ATGC с ATGAGCA, я думаю, что вы могли бы хотеть /(?: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)+/;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...