2011-09-25 68 views
5

我有一個包含以下行DDD-1126N|refseq:NP_285726|uniprotkb:P00112DDD-1081N|uniprotkb:P12121一個巨大的文件,我想uniprotkb後搶號。如何搶號字之後蟒蛇

這裏是我的代碼:

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

line.find(x)的問題是10和26,我搶了完整的數字時,它是26.我是新來的節目,所以我尋找的東西搶字之後的完整數字。

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

你還沒有接受你的大部分問題的答案。你意識到你爲每一個你接受的+2聲望?如果至少有一個答案有幫助,您應該點擊旁邊的複選標記標記每個答案的最佳/最有用答案。 – agf

回答

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

嗯,一件事我會建議你使用csv module讀取TSV文件。

但是總體來說,你可以使用正則表達式:

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

正則表達式的字母數字字符的字符串,如果它是由前uniprotkb:匹配。

6

使用正則表達式:

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

爲我完美工作。 – Stryker

3

re模塊是完全沒有必要在這裏如果x是靜態的,總是一個字符串在每行的結尾匹配(如"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):] 

編輯: 回答你的評論。如果他們用管道字符(|)分離出來,然後你可以這樣做:

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 

如果m.txt有以下行:

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

然後上面會輸出:

['285726', 'P00112'] 

用任何列分隔符替換sep = "|"

+0

如果我有兩列中的代碼,代碼如何? – graph

+0

已更新的答案。我假設列由「|」分隔。 – chown

+0

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