12

我有一个包含以下行的大文件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
4

4 回答 4

16

使用正则表达式:

import re
for line in open('m.txt'):
    match = re.search('uniprotkb:P(\d+)', line)
    if match:
        print match.group(1)
于 2011-09-25T21:25:08.683 回答
9
import re
regex = re.compile('uniprotkb:P([0-9]*)')
print regex.findall(string)
于 2011-09-25T21:22:39.430 回答
4

如果模块是静态的并且总是匹配每行末尾的子字符串(如),则该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 = "|"为任何列分隔符。

于 2011-09-25T21:25:40.257 回答
1

嗯,一方面,我建议您使用该csv模块来读取 TSV 文件。

但通常,您可以使用正则表达式:

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

如果正则表达式前面带有 . 则匹配一串字母数字字符uniprotkb:

于 2011-09-25T21:24:41.850 回答