2011-09-25 10 views
5

Tengo un gran archivo que contiene las siguientes líneas DDD-1126N|refseq:NP_285726|uniprotkb:P00112 y DDD-1081N|uniprotkb:P12121, quiero obtener el número después de uniprotkb.Cómo capturar número tras nombre en python

Aquí está mi código:

x = 'uniprotkb:P' 
f = open('m.txt') 
for line in f: 
    print line.find(x) 
    print line[36:31 + len(x)] 

El problema en line.find(x) es 10 y 26, agarro el número completo cuando es 26. Soy nuevo en la programación, así que estoy buscando algo para agarrar el número completo después de la palabra.

x = 'uniprotkb:' 
f = open('m.txt') 
for line in f: 
    if x in line: 
    print the number after x 
+3

Aún no ha aceptado las respuestas a la mayoría de sus preguntas. ¿Te das cuenta de que obtienes una reputación de +2 por cada uno que aceptas? Debe marcar la respuesta mejor/más útil para cada una de ellas, aceptada haciendo clic en la marca de verificación al lado, si al menos una de las respuestas fue útil. – agf

Respuesta

5
import re 
regex = re.compile('uniprotkb:P([0-9]*)') 
print regex.findall(string) 
0

Um, por una cosa que te sugiero que utilice el csv module para leer un archivo TSV.

Pero, en general, se puede utilizar una expresión regular:

import re 
regex = re.compile(r"(?<=\buniprotkb:)\w+") 
for line in f: 
    match = regex.search(line) 
    if match: 
     print match.group() 

La expresión regular coincide con una cadena de caracteres alfanuméricos si está precedida por uniprotkb:.

6

utilizar expresiones regulares:

import re 
for line in open('m.txt'): 
    match = re.search('uniprotkb:P(\d+)', line) 
    if match: 
     print match.group(1) 
+0

funcionó perfectamente para mí. – Stryker

3

El módulo re es totalmente innecesario aquí six es estático y siempre coincide con una subcadena al final de cada línea (como "DDD-1126N|refseq:NP_285726|uniprotkb:P00112"):

x = 'uniprotkb:' 
f = open('m.txt') 
for line in f: 
  if x in line: 
    print line[line.find(x)+len(x):] 

Editar: Para responderte comentario. Si están separados por el caracter (|), entonces se podría hacer esto:

sep = "|" 
x = 'uniprotkb:' 
f = open('m.txt') 
for line in f: 
  if x in line: 
    matches = [l[l.find(x)+len(x):] for l in line.split(sep) if l[l.find(x)+len(x):]] 
    print matches 

Si m.txt tiene la siguiente línea:

DDD-1126N|uniprotkb:285726|uniprotkb:P00112 

Luego de lo anterior es la salida:

['285726', 'P00112'] 

Reemplace sep = "|" con el separador de columna que sea.

+0

Si tengo columnas de línea en remolque, ¿cómo se ve el código? – graph

+0

Respuesta actualizada. Supongo que las columnas están separadas por un "|". – chown

+0

'línea [line.rfind ('P') + 1]' – agf

Cuestiones relacionadas