有没有办法找到短语并捕获下一个标记值

时间:2012-07-11 20:42:22

标签: python parsing

所以我在服务器上有一个这样的文件:

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] 

2 个答案:

答案 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