在Python中使用regex将数据转换为字典

2024-10-04 03:15:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用FASTA格式排序的数据集,基本上如下所示:

>pc284  
ATCGCGACTCGAC

>pc293  
ACCCGACCTCAGC

我想把每个标签作为字典中的键使用,并将基因存储为一个值。在

这是我的代码,但实际上什么也没做:

^{pr2}$

Tags: 数据代码字典排序格式基因标签fasta
3条回答

我看到两个错误:

你的正则表达式可能是错的。您的FASTA输入不太可能实际包含一个空回车符(\r),因此您的regex不会匹配任何内容。因此if match:测试总是错误的,所以什么都不会发生。在

此外,在处理每个匹配项时:将gene的第一个字符(空白)添加为键,将第二个字符添加为值。在

你可能想分别使用第2组和第4组:

myDict[match.group(2)] = match.group(4)

\r不是一个有效的字符类,我想你是想用\s代替。如果你不使用它们,你可以减少它们。在

但最重要的是,您需要正确提取组:

match = re.search(r'>(\w+)\s+(\w+)', line)
if match:
    tag, gene = match.groups()
    myDict[tag] = gene

通过只创建两个捕获组,我们可以更简单地用.groups()提取这两个,并直接将它们分配给两个变量,tag和{}。在

然而,阅读FASTA format似乎表明这是一种多行格式,标签在一行,基因数据在多行之后。在这种情况下,您的\r是为了匹配换行符。当你一次读一行文件时,这行不通。在

如果不使用以下正则表达式,则读取该格式会简单得多:

^{pr2}$

这将逐行读取文件,根据起始的>字符检测标记,然后读取多行基因信息,将其收集到字典中最近读取的标记下。在

注意rU模式;我们使用python的universal newlines mode打开文件,以处理创建文件时使用的任何换行约定。在

最后但并非最不重要的是,看看BioPy project;它们的^{} module可以完美地处理FASTA和其他许多格式。在

不要为此使用正则表达式。。。在

class FASTA(object):
    def __init__(self,data):
        self.data = data.strip().splitlines()
        self.desc = self.data[0]
        self.sequence = "".join(self.data[1:]).replace(" ","")#get rid of spaces
    def  GetCodons(self):
        return [self.sequence[i:i+3] for i in range(0,len(self.sequence),3)]
    def __str__(self):
        return "DESC:'%s'\nSEQ:'%s'"%(self.desc,self.sequence)

with open("data.fasta") as f:
      data = f.read()
parts = data.split(">")
for p in parts[1:]:
    f= FASTA(p)
    print f
    print f.GetCodons()

相关问题 更多 >