2016-10-17 31 views
1

Ich brauche einen regulären Ausdruck in Perl, der am Anfang mit ATG übereinstimmt und mit TAG, TAA oder TGA endet. Dies ist der Code, den ich bisher habe.Regelmäßige Perl-Expression (beginnt mit ATG und endet mit TAG, TAA oder TGA)

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA'; 

while($sequence =~ ____) { 
print $1; 
} 
+0

[.? '^ ATG * (T (AG | AA | GA)) $'] (https: // regex101.com/r/tUtg8J/1) – Tushar

+1

Ihr Beispiel entspricht nicht Ihren Anforderungen. Sieht so aus, als ob du die DNA-Sequenz anpassen willst, also vielleicht '^ ATG [GTAC] + T (GA | AA | AG) $'. – chris85

Antwort

5

Seit Sie haben mit codons hier zu tun, haben Sie wahrscheinlich vergessen, das Nucleotid zu erwähnen

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA'; 
       # |--------------1-------------| 
       #          |---2---| 

while($sequence =~ /ATG(?:[ACTG]{3})*?T(?:A[AG]|GA)/g) 
{ 
    print $&."\n"; 
} 

Ausgabe:: s dazwischen muss ein Vielfaches von 3.

-Code sein

ATGGTTTCTCCCATCTCTCCATCGGCATAA 
ATGATCTAA 

Beschreibung:

  • ATG - Spiele "ATG" buchstäblich
  • (?:[ACTG]{3})*? - ein non capturing group ist, wiederholt 0 o mehrmals, so wenig wie möglich (lazy quantifier, die zusätzlichen ?), passend zu:
    • [ACTG]{3} - 3 Zeichen/Nukleotiden (entweder „A "," C "," T "oder" G ")
  • T(?:A[AG]|GA) - entspricht" TAA "," TAG "oder" TGA ". Auch als Borodincommented kann dies als (?:TAG|TAA|TGA) geschrieben werden, wenn Sie die Lesbarkeit verbessern möchten.


Aber wenn Sie auch überlappende Sequenzen übereinstimmen müssen, sollten Sie einen lookahead verwenden, das Spiel zu verhindern, dass die Zeichen raubend.

Code:

   # modified to include overlapping sequences 
my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATATGGAATGATCTAACGAA'; 
       # |--------------1-------------| 
       #         |---2---| 
       #          |---3---| 

while($sequence =~ /ATG(?=((?:[ACTG]{3})*?T(?:A[AG]|GA)))/g) 
{ 
    print $&.$1."\n"; 
} 

Ausgang:

ATGGTTTCTCCCATCTCTCCATCGGCATAA 
ATGGAATGA 
ATGATCTAA 


Und schließlich ist dies eine mehr efficent Version des letzten Ausdrucks, diemitTechnik, die bessere Ergebnisse liefert, wenn Sie mit großen Sequenzen zu tun haben.

Code:

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATATGGAATGATCTAACGAA'; 
       # modified to include overlapping sequences 

while($sequence =~ /ATG(?=((?:[ACG][ACTG]{2})*(?:T(?:A[CT]|G[CTG]|[CT][ACTG])(?:[ACG][ACTG]{2})*)*T(?:A[AG]|GA)))/g) 
{ 
    print $&.$1."\n"; 
} 

Ausgang:

ATGGTTTCTCCCATCTCTCCATCGGCATAA 
ATGGAATGA 
ATGATCTAA 
+0

Ich denke, dass dein 'T (?: A [AG] | GA)' als '(?: TAG | TAA | TGA)' geschrieben werden sollte, was klarer und kaum mehr ist. Perl wird die Alternativen als Trie optimieren, so dass es auch keine Auswirkungen auf die Effizienz gibt. – Borodin

+0

Danke für den Vorschlag @Borodin. Ich habe deinen Kommentar in der Antwort hinzugefügt. Ich weiß nicht warum, aber ich bevorzuge 'T (?: A [AG] | GA)' ... Ich lese es gerne als "* a T gefolgt von ... *". – Mariano

1

Nicht sicher, ob dies ist, was Sie suchen, aber dies findet ein Spiel so ist es nicht erschöpfende

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA'; 

if($sequence =~ /(ATG.*?(:?TAG|TAA|TGA))/) { 
print $1; 
} 

OUTPUT

ATGGTTTCTCCCATCTCTCCATCGGCATAA 
1
Try this: 
#!/usr/bin/perl 
my $sequence ='AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA'; 
while($sequence =~m/ATG.*?(TGA|TAG|TAA)/g) 
{ 
    print $&,"\n"; 
} 
Verwandte Themen