Regex Protein Verdauung

8

Also verdaue ich eine Proteinsequenz mit einem Enzym (für Ihre Neugier, Asp-N), das vor den von B oder D kodierten Proteinen in einer einbuchstabigen codierten Sequenz spaltet. Meine tatsächliche Analyse verwendet String#scan für die Captures. Ich versuche herauszufinden, warum der folgende reguläre Ausdruck es nicht richtig verdaut ...

%Vor%

wo der Antezedens (.*\b) existiert, um das Ende der Sequenz zu erfassen. Für:

%Vor%

Dies sollte etwas wie: [MTM, DKPSQY, DKIEAELQ, DICN, DVLELL, DSKG, ... ] , aber stattdessen fehlt jedes D in der Sequenz.

Ich habe Ссылка zur Fehlerbehebung verwendet, was unter 1.8.7 ausgeführt wird, obwohl ich dieses REGEX auch unter 1.9.2 getestet habe umsonst. Nach meinem Verständnis werden Lookahead-Assertionen mit einer Breite von Null in beiden Versionen von Ruby unterstützt. Was mache ich falsch mit meiner Regex?

    
Ryanmt 18.05.2011, 23:30
quelle

2 Antworten

3

Der einfachste Weg, dies zu unterstützen, ist die Aufteilung auf das Lookahead mit der Breite Null:

%Vor%

Um zu verstehen, was mit Ihrer Lösung nicht funktioniert hat, betrachten wir zuerst Ihre Regex im Vergleich zu einer, die funktioniert:

%Vor%

Das Problem besteht darin, dass Sie erfolgreich vorgehen können, ohne den Scan-Zeiger weiter zu bewegen, wenn Sie null Zeichen erfassen können und trotzdem Ihren Vorschau-Lookup mit der Breite Null erreichen. Sehen wir uns einen einfacheren, aber ähnlichen Testfall an:

%Vor%

Eine naive Implementierung von String#scan könnte in einer Endlosschleife steckenbleiben und wiederholt mit dem Zeiger vor dem ersten Zeichen übereinstimmen. Es scheint, dass, sobald eine Übereinstimmung auftritt, ohne den Zeiger vorwärts zu bewegen, der Algorithmus zwangsweise den Zeiger um ein Zeichen vorschiebt. Dies erklärt die Ergebnisse in Ihrem Fall:

  1. Zuerst stimmt es alle Zeichen bis zu einem B oder D ab,
  2. dann stimmt es mit der Null-Breite-Position direkt vor dem B oder D überein, ohne den Zeichenzeiger zu bewegen,
  3. Als Ergebnis bewegt der Algorithmus den Zeiger nach B oder D und fährt danach fort.
Phrogz 19.05.2011, 02:40
quelle
9

Grundsätzlich möchten Sie die Zeichenfolge vor jedem B oder D schneiden?

%Vor%

Gibt dir

%Vor%     
Thomas Hupkens 18.05.2011 23:41
quelle

Tags und Links