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 ...
wo der Antezedens (.*\b)
existiert, um das Ende der Sequenz zu erfassen.
Für:
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?
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:
Grundsätzlich möchten Sie die Zeichenfolge vor jedem B oder D schneiden?
%Vor%Gibt dir
%Vor%Tags und Links ruby regex bioinformatics