Using regex to transform data into a dictionary in Python

后端 未结 4 1700
失恋的感觉
失恋的感觉 2020-12-21 10:22

I have a dataset with FASTA formatted sequencing, basically like this:

>pc284  
ATCGCGACTCGAC

>pc293  
ACCCGACCTCAGC

I want to take

4条回答
  •  遥遥无期
    2020-12-21 11:19

    \r is not a valid character class, I think you meant to use \s instead. You can reduce the groups if you don't use them either.

    But most of all, you need to extract your groups correctly:

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

    By creating only two capturing groups, we can more simply extract those two with .groups() and directly assign them to two variables, tag and gene.

    However, reading up on the FASTA format seems to indicate this is a multi-line format with the tag on one line, the gene data on multiple lines after that. In that case your \r was meant to match the newline. This won't work as you read the file one line at a time.

    It would be much simpler to read that format without regular expressions like so:

    myDict = {}
    
    with open('d.fasta', 'rU') as fileData:
        tag = None
        for line in fileData:
            line = line.strip()
            if not line:
                continue
            if line[0] == '>':
                tag = line[1:]
                myDict[tag] = ''
            else:
                assert tag is not None, 'Invalid format, found gene without tag'
                myDict[tag] += line
    
    print myDict
    

    This reads the file line by line, detecting tags based on the starting > character, then reads multiple lines of gene information collecting it into your dictionary under the most-recently read tag.

    Note the rU mode; we open the file using python's universal newlines mode, to handle whatever newline convention was used to create the file.

    Last but not least; take a look at the BioPy project; their Bio.SeqIO module handles FASTA plus many other formats perfectly.

提交回复
热议问题