2011-09-25 12 views
5

Ho un file enorme contenente le seguenti righe DDD-1126N|refseq:NP_285726|uniprotkb:P00112 e DDD-1081N|uniprotkb:P12121, voglio prendere il numero dopo uniprotkb.Come acquisire numero dopo parola in python

Ecco il mio codice:

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

Il problema in line.find(x) è 10 e 26, prendo il numero completo quando è 26. Sono nuovo di programmazione, quindi sono alla ricerca di qualcosa di afferrare il numero completo dopo la parola.

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

Non hai ancora accettato le risposte alla maggior parte delle tue domande. Ti rendi conto di ottenere una reputazione di +2 per ognuno di quelli che accetti? Dovresti segnare la risposta migliore/più utile a ciascuna come accettata facendo clic sul segno di spunta accanto ad essa, se almeno una delle risposte è di aiuto. – agf

risposta

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

Um, per una cosa che suggerirei di utilizzare il csv module di leggere un file TSV.

Ma in generale, si può usare un'espressione regolare:

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

L'espressione regolare corrisponde a una stringa di caratteri alfanumerici se è preceduto da uniprotkb:.

6

utilizzare le espressioni regolari:

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

ha funzionato perfettamente per me. – Stryker

3

Il modulo re è del tutto inutile qui sex è statica e sempre corrisponde a una stringa alla fine di ogni riga (come "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):] 

Modifica: Per rispondere al tuo commento. Se essi sono separati dal carattere pipe (|), allora si potrebbe fare questo:

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 

se m.txt ha la seguente riga:

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

Poi il seguente output:

['285726', 'P00112'] 

Sostituire sep = "|" con qualsiasi sia il separatore di colonna.

+0

Se ho una linea in colonne di traino come appare il codice? – graph

+0

Risposta aggiornata. Suppongo che le colonne siano separate da un "|". – chown

+0

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

Problemi correlati