如何在python中获取单词后的数字

如何在python中获取单词后的数字,python,regex,re,Python,Regex,Re,我有一个包含以下行的大型文件DDD-1126N | refseq:NP_285726 | uniprotkb:P00112和DDD-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)] 查找(x)行中的问题是10和26,当它是26时,我获取完整

我有一个包含以下行的大型文件
DDD-1126N | refseq:NP_285726 | uniprotkb:P00112
DDD-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)]
查找(x)行中的问题是10和26,当它是26时,我获取完整的数字。我是编程新手,所以我正在寻找一些东西来获取单词后面的完整数字

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

嗯,首先我建议你用这个来读取TSV文件

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

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

regex=re.compile(r)(?使用正则表达式:

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

如果
x
是静态的,并且总是在每行末尾匹配一个子字符串,那么这里就不需要使用
re
模块(如
“DDD-1126N | refseq:NP_285726 | uniprotkb:P00112”
):


编辑: 回答您的评论。如果它们由管道字符(
|
)分隔,则可以执行以下操作:

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=“|”
替换为任何列分隔符。

更新了答案。我假设列之间用|"。您尚未接受大多数问题的答案。您意识到,您接受的每个问题都会获得+2的声誉?如果至少有一个答案有帮助,您应该单击旁边的复选标记,将每个问题的最佳/最有帮助答案标记为已接受。这对我来说非常有效。请注意,这将打印一个与以下内容匹配的所有内容的列表:正则表达式
DDD-1126N|uniprotkb:285726|uniprotkb:P00112
['285726', 'P00112']