所以我在服务器上有一个这样的文件:
COADREAD ATF7 Missense_Mutation NGXA-AZ-3984 P17544 A436T
COADREAD ATG10 Missense_Mutation NGXA-AB-A010 Q9H0Y0 H133N
我的目标是找到id(P17544),它在文件的第5列和捕获/存储(我需要稍后打印该号码)后面的令牌号码是436(这个号码假设为在第6栏A436T的两个字母之间。 我有办法做到这一点吗?我以前用lxml做过一点但仍不确定如何做到这一点。提前谢谢
这就是我所拥有的
file = open('text.txt','r')
查找= {}
for line in file:
myid, token = file.rsplit(' ', 2)[1:]
token = token[1:-1]
答案 0 :(得分:2)
最简单的方法使用内置str
方法:
d = 'COADREAD ATF7 Missense_Mutation NGXA-AZ-3984 P17544 A436T'
myid, token = d.rsplit(' ', 2)[1:] # will except if can't be unpacked so you know you've got exactly 2 elements...
token = token[1:-1]
如果您想指定两个字母之间的数字,可以使用正则表达式... re.match('[A-Z](\d{3})[A-Z]', token[1]) # or similar...
<强>澄清:强>
d.rsplit(' ', 2)
- 开始将' '
s处的字符串从返回['COADREAD ATF7 Missense_Mutation NGXA-AZ-3984', 'P17544', 'A436T']
的结尾处拆分。假设我们只查找最后两个元素,我们会删除带有切片的第一个元素,因此我们得到d.rsplit(' ', 2)[1:]
,其中['P17544', 'A436T']
。
使用解包,我们命名变量,并使用myid, token = d.rsplit(' ', 2)[1:]
保证它的长度为2 - 如果它没有正好两个元素,则赋值将失败。
既然myid
应该是您想要的ID,请使用切片token = token[1:-1]
从令牌中删除第一个和最后一个字符。
然后:
print myid, token
# P17544 436
关于查找的评论:
在解析文件行后查找:
lookup = {}
for line in file:
# do steps above so you have myid, token
lookup[myid] = token
然后查找['P17544']将返回'436'
希望更清楚......
答案 1 :(得分:0)
听起来很容易......沿着空间分开 - 然后提取第五个字段......以及第六个字段中的所有数字。或者我错过了什么?
>>> tokens = "COADREAD ATF7 Missense_Mutation NGXA-AZ-3984 P17544 A436T".split()
>>> print tokens[4]
P17544
>>> print ''.join([c for c in tokens[5] if c.isdigit()])
436