2009-12-04 9 views
8

Czy istnieje wyrażenie regularne dla sekwencji (teoretycznej) tryptic rozkładu protein? Zasada cięcia dla trypsyny jest po R lub K, ale nie przed P.Czy istnieje regularna ekspresja dla enzymatycznego cięcia?

przykład:

odcięcie sekwencji VGTKCCTKPESERMPCTEDYLSLILNR należy prowadzić w tych sekwencjach (3 peptide s)

VGTK 
CCTKPESER 
MPCTEDYLSLILNR 

Zauważ, że nie ma cięcia po K w drugim peptydzie (ponieważ P występuje po K).

W Perl (może to równie dobrze być w C# Python lub Ruby)

my $seq = 'VGTRCCTKPESERMPCTEDYLSLILNR'; 
    my @peptides = split /someRegularExpression/, $seq; 

I stosuje się to obejście (gdzie znacznik cięcia, =, jest po raz pierwszy wstawiane w sekwencji i ponownie usunięty, jeśli P jest natychmiast po ekspres do cięcia):

my $seq  = 'VGTRCCTKPESERMPCTEDYLSLILNR'; 
    $seq   =~ s/([RK])/$1=/g; #Main cut rule. 
    $seq   =~ s/=P/P/g;  #The exception. 
    my @peptides = split(/=/, $seq); 

Ale to wymaga modyfikacji łańcucha, które mogą być potencjalnie bardzo długo i nie może być miliony sekwencji. Czy istnieje sposób, w którym wyrażenie regularne może być używane z podziałem? Jeśli tak, jakie będzie wyrażenie regularne?


Platforma testowa: Windows XP 64-bitowy. ActivePerl 64-bitowy. Z perl -v: v5.10.0 zbudowany dla MSWin32-x64-multi-thread.

+0

rozszczepienie ........ – user105033

+0

@unknown: kontekst ... od http://en.wikipedia.org/wiki/Tryptic: „trypsyny są uważane za endopeptydazy, tj. cięcie zachodzi w obrębie łańcucha polipeptydowego, a nie w końcowych aminokwasach znajdujących się na końcach polipeptydów. " –

+4

Prawdopodobnie najlepsze pytanie w historii. Ilu innych może pochwalić się kodem, nauką i seksualnymi wnioskami naraz, a jednocześnie jest całkowicie wiarygodne i odpowiedzialne? – shuckster

Odpowiedz

14

Rzeczywiście trzeba użyć kombinacji pozytywnego lookbehind i negatywnego uprzedzenia. Poprawna składnia (Perl) jest następujący:

my @peptides = split(/(?!P)(?<=[RK])/, $seq); 
+2

Na pewno masz na myśli negatywny uprzedzający i pozytywny lookbehind. –

+0

Tak, to działa. –

6

Można użyć look-around assertions, aby wykluczyć takie przypadki. Coś jak to powinno działać:

split(/(?<=[RK](?!P))/, $seq) 
+0

Przepraszam, jeśli się mylę, ale czy nie skończyłoby się to rozdzieleniem przed R/K w sekwencji, a nie po? –

+0

Rzeczywiście, to nie zadziała. RK musi być pozytywnym lookbehind (? <= ...) –

+0

@Anon i gab: tak, to powoduje cięcie wcześniej; 4 peptydy: VGT, RCCTKPESE, RMPCTEDYLSLILN i R –

4

Można użyć lookaheads i lookbehinds dopasować te rzeczy jednocześnie uzyskanie prawidłowej pozycji.

/(?<=[RK])(?!P)/ 

przypadku kończy się w punkcie rozszczepienia po R lub K, które nie następuje P.

+0

'/ (? <[RK]) (?= [^ P])/'unika dzielenia pustego łańcucha na końcu – ysth

+0

Dla obu: nie akceptowane w czasie kompilacji. Dla ysth: "Sekwencja (? <[...) nie jest rozpoznawana w regex, oznaczona przez <- TUTAJ wm/(? <[<- HERE RK]) (? = [^ P]) /". Zaktualizowałem to pytanie, korzystając z informacji o platformie. –

+0

Niestety, skompromitowałem pozytywną składnię lookbehind. Powinno to być '(? <= ...'. Poprawię to. –

1

W Pythonie można użyć metody finditer powrotu nienakładające się wzorzec pasuje tym początek i zakres informacji. Możesz następnie przechowywać przesunięcia ciągów zamiast przebudowywać ciąg.

+2

perl może to zrobić jako Zobacz http://stackoverflow.com/questions/467800/is-there-a-perl-equivalent-of-pythons-re-findall-re-finditer-iterative-regex-re – dwarring