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

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

5
你还没有接受大部分问题的答案。你知道每次接受答案可以获得+2的声望值吗?如果有至少一个答案对你有所帮助,你应该点击旁边的勾选标记来标记最佳/最有帮助的答案为已接受答案。请注意,不要改变原来的意思。 - agf
4个回答

26

使用正则表达式:

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

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

1
请注意,这将打印与正则表达式匹配的所有内容列表。 - Daniel Holmes

5
如果 x 是静态的并且始终匹配每行结尾的子字符串(例如 "DDD-1126N|refseq:NP_285726|uniprotkb:P00112"),那么这里的 re 模块就显得非常不必要了。
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 = "|" 替换为列分隔符。

1

嗯,首先我建议您使用{{link1:csv模块}}来读取TSV文件。

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

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

如果字符串前面有uniprotkb:,则正则表达式匹配一个包含字母数字字符的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接