2016-12-10 2 views
2

Ich versuche, mindestens vier G-Wiederholungen, jede Wiederholung getrennt durch ein Maximum von 7 Zeichen. Beispiel:Perl reguläre Ausdruck Mismatchs repetitive Strings

AAGGGAAGGGAAAGGGAAGGGAA 

Ich verwende folgende Regex, die Groß- und Kleinbuchstaben entsprechen sollte.

$sequence =~ /((G{3,}[ATGC]{1,7}){3,}G{3,})/gi 

Dies sollte mindestens vier G-Wiederholungen entsprechen. Das Problem ist, dass ich einen positiven Erfolg, wenn ich die folgende Sequenz übereinstimmen:

aaagaggaaaaggggaaaaggggaaaaggggaaa 

Die erste Wiederholung in dieser Sequenz enthält drei gs, durch eine ein getrennt. Daher sollte diese Sequenz nicht übereinstimmen.

Lösung 1: Das Problem schien der Modifikator/i zu sein. Ich könnte es korrigieren, indem Sie die Regex ändern:

$sequence =~ /(([gG]{3,}[aAtTgGcC]{1,7}){3,}[gG]{3,})/g 

Lösung 2 von Ikegami zur Verfügung gestellt: Negative Lookahead.

$sequence =~ /(([?!G]{3,}[ATGC]{1,7}){3,}[G]{3,})/gi 

Danke @ikegami für den Hinweis und für die Einreichung der Fehlerbericht.

+1

Dort scheint [nicht zu sein] (https://regex101.com/r/osA53E/1) ein positiver Treffer in der zweiten Sequenz. –

+0

@ Nicolas Maltais, das OP verwendet Perl, nicht PCRE. – ikegami

+0

Wenn Sie mindestens 4 Gs abgleichen möchten, warum beginnt der Quantifizierer bei 3? Siehe http://perldoc.perl.org/perlre.html#Regular-Expressions – shawnhcorey

Antwort

4
$ perl -E'say $& while "aaagaggaaaaggggaaaaggggaaaaggggaaa" =~ /((G{3,}[ATGC]{1,7}){3,}G{3,})/gi' 
gggaaaaggggaaaagggg 

Sie haben einen Fehler gefunden! Ich habe eine bug report eingereicht.

Dieser Fehler tritt seit mindestens 5.10 auf und ist in der neuesten Version (5.24.0) enthalten.

Update: Behoben in Perl 5.26, veröffentlicht am 2017-05-30.

+0

Ich brauche ein G in [ATGC], weil die Verbindungssequenz aaagaaa sein könnte. – Zipfer

+0

Warum negatives Lookahead? Wenn die Regex mit einem G übereinstimmt, das dem GGG folgt, wird es als GGGG erkannt, dem ein [ATC] folgen muss. Folgt dem GGG AG, funktioniert der Regex. – Zipfer

+0

Das stimmt, funktioniert auch. Wenn ich das? zu G {3} und gleichzeitig den Modifikator/i verwenden, stimmt die Regex nicht mit 'gaggaaagggaaagggaaaggg' überein. Aber wenn ich '([gG] {3} [aAcCgGtT] ...' anpasse, erkennt die Regex 'gaggaaaggg ... 'nicht mehr. – Zipfer