La digestión con tripsina (escisión) no funciona con expresiones regulares

He intentado codificar la división tríptica teórica de secuencias de proteínas en Python. La regla de escisión para la tripsina es: después de R o K, pero no antes de P. (es decir, la tripsina corta (corta) la secuencia de la proteína después de cada K o R, a menos que (K o R) esté seguida de una P).

Ejemplo: La división (corte) de la secuencia MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK debe dar como resultado estas 4 secuencias (péptidos):

 MVPPPPSR GGAAKPGQLGR SLGPLLLLLRPEEPEDGDR EICSESK 

Tenga en cuenta que no hay división después de K en el segundo péptido (porque P viene después de K) y no hay división después de R en el tercer péptido (porque P viene después de R).

He escrito este código en Python, pero no funciona bien. ¿Hay alguna manera de implementar esta expresión regular de manera más significativa?

  # Open the file and read it line by line. myprotein = open(raw_input('Enter input filename: '),'r') if os.path.exists("trypsin_digest.txt"): os.remove("trypsin_digest.txt") outfile = open("trypsin_digest.txt",'w+') for line in myprotein: protein = line.rstrip() protein = re.sub('(?<=[RK])(?=[^P])','', protein) for peptide in protein: outfile.write(peptide) print 'results written to:\n', os.getcwd() +'\ trypsin_digest.txt' 

Así es como lo conseguí para mí.

  myprotein = open(raw_input('Enter input filename: '),'r') my_protein = [] for protein in myprotein: myprotein = protein.rstrip('\n') my_protein.append(myprotein) my_pro = (''.join(my_protein)) #cleaves sequence peptides = re.sub(r'(?<=[RK])(?=[^P])','\n', my_pro) print peptides 

Secuencia de proteínas:

MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICS

Salida (sitios de escisión de tripsina) o péptidos

MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK
MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK
MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK

las expresiones regulares son agradables, pero aquí hay una solución que usa Python regular. Ya que está buscando subsecuencias en las bases, tiene sentido construir esto como un generador, que produce los fragmentos.

 example = 'MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK' def trypsin(bases): sub = '' while bases: k, r = bases.find('K'), bases.find('R') cut = min(k, r)+1 if k > 0 and r > 0 else max(k, r)+1 sub += bases[:cut] bases = bases[cut:] if not bases or bases[0] != 'P': yield sub sub = '' print list(trypsin(example)) 

EDITAR Con una ligera modificación su expresión regular funciona bien:

En su comentario, mencionó que tiene varias secuencias en un archivo (llamémosmosósolas.dat):

 $ cat sequences.dat MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK >>> with open('sequences.dat') as f: s = f.read() >>> print(s) MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK >>> protein = re.sub(r'(?<=[RK])(?=[^P])','\n', s, re.DOTALL) >>> protein.split() ['MVPPPPSR', 'GGAAKPGQLGR', 'SLGPLLLLLRPEEPEDGDR', 'EICSESK', 'MVPPPPSR', 'GGAAKPGQLGR', 'SLGPLLLLLRPEEPEDGDR', 'EICSESK', 'MVPPPPSR', 'GGAAKPGQLGR', 'SLGPLLLLLRPEEPEDGDR', 'EICSESK'] >>> print protein MVPPPPSR GGAAKPGQLGR SLGPLLLLLRPEEPEDGDR EICSESK MVPPPPSR GGAAKPGQLGR SLGPLLLLLRPEEPEDGDR EICSESK MVPPPPSR GGAAKPGQLGR SLGPLLLLLRPEEPEDGDR EICSESK 

Creo que la siguiente expresión regular hará lo que usted ha descrito:

 ([KR]?[^P].*?[KR](?!P)) 

Resultado abajo de pythonregexp

 >>> regex = re.compile("([KR]?[^P].*?[KR](?!P))") >>> r = regex.search(string) >>> r <_sre.SRE_Match object at 0xb1a9f49eb4111980> >>> regex.match(string) <_sre.SRE_Match object at 0xb1a9f49eb4102980> # List the groups found >>> r.groups() (u'MVPPPPSR',) # List the named dictionary objects found >>> r.groupdict() {} # Run findall >>> regex.findall(string) [u'MVPPPPSR', u'GGAAKPGQLGR', u'SLGPLLLLLRPEEPEDGDR', u'EICSESK']