次の簡単なコードでは、出発点である(同じ位置または異なる位置に、すなわち)任意の位置に来るかもしれません。ファイルからパターンを読み込み、Fastaファイルからシーケンスを読み込むことは簡単に一般化できます。ユニークな結果など
sub trans_pat {
my $pat=shift;
$pat=~s/R/\[CG\]/g;
$pat=~s/W/\[AT\]/g;
$pat=~s/Y/\[AG\]/g;
return $pat;
}
sub find_pat {
my ($pat,$seq) = (@_);
print "Looking for pattern $pat\n";
while ($seq=~m/$pat/g) {
print "... match at $-[0]: $&\n";
};
}
my $read_pat="ATCR";
my $seq="ATCGATATCGAT";
# Looking for a perfect match
find_pat (trans_pat($read_pat),$seq);
# Allowing for a single mismatch
foreach $i (1..length $read_pat) {
my $mis_pat = $read_pat;
substr($mis_pat,$i-1,1) = ".";
find_pat (trans_pat($mis_pat),$seq);
}
サンプル実装:
perl -e 'sub trans {$pat=shift;$pat=~s/R/\[CG\]/g;return $pat};$read_pat="ATCR";$seq="ATCGATATCGAT";$pat=trans($read_pat);print "Looking for pattern $pat\n";while ($seq=~m/$pat/g) {print "... match at $-[0]: $&\n"};foreach $i (1..length $read_pat) {$mis_pat = $read_pat;substr($mis_pat,$i-1,1)=".";$pat=trans($mis_pat);print "Looking for pattern $pat\n"; while ($seq=~m/$pat/g) {print "... match at $-[0]: $&\n"}}'
は、あなたがこれまでに試みられてきた何
Looking for pattern ATC[CG]
... match at 0: ATCG
... match at 6: ATCG
Looking for pattern .TC[CG]
... match at 0: ATCG
... match at 6: ATCG
Looking for pattern A.C[CG]
... match at 0: ATCG
... match at 6: ATCG
Looking for pattern AT.[CG]
... match at 0: ATCG
... match at 6: ATCG
Looking for pattern ATC.
... match at 0: ATCG
... match at 6: ATCG
が得? – Bruce
"one mismatch is allowed"という制約は、それ自身では正規表現には難しいでしょう。一連の正規表現を生成することができます。正規表現のそれぞれには、文字のいずれかが許可されています。 – frezik