Python:在具有相同关键字的两行之间进行解析

2024-05-21 03:16:06 发布

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

我知道如何在两行之间解析,当开始的“目标词”和结束的“目标词”不同时

例如,如果我想在X和Y之间解析:

parse = False
for line in open(sys.argv[1]):
 if Y in line:
    parse = False
if parse:
   print line
if X in line:
   parse = True

我被困在一个稍微不同的问题上,我想解析的词是同一个词。i、 e.在这个例子中,有4个不同的同系物组,我想提取每个同系物组中的人/鼠对,所以我想打开这个文件:

1:_HomoloGene:_141209.Gene_conserved_in_Mammals 
LOC102724657                            Homo_sapiens
Gm12569                                 Mus_musculus
2:_HomoloGene:_141208.Gene_conserved_in_Euarchontoglires    
LOC102724737                            Homo_sapiens
LOC102636216                            Mus_musculus
3:_HomoloGene:_141152.Gene_conserved_in_Euarchontoglires    
LOC728763                               Homo_sapiens
E030010N07Rik                           Mus_musculus
E030010N09Rik                           Mus_musculus
E030010N010Rik                          Mus_musculus
E030010N08Rik                           Mus_musculus
LOC102551034                            Rattus_norvegicus
4:_HomoloGene:_141054.Gene_conserved_in_Boreoeutheria       
LOC102723572                            Homo_sapiens
LOC102157295                            Canis_lupus_familiaris
LOC102633228                            Mus_musculus

像这样比较智人和小家鼠:

Homo_sapiens    Mus_musculus
LOC102724657    Gm12569 
LOC102724737    LOC102636216
LOC728763       E030010N07Rik
LOC728763       E030010N09Rik
LOC728763       E030010N010Rik
LOC728763       E030010N08Rik   
LOC102723572    LOC102633228

我没有成功的代码可以展示,这是我尝试过的一个例子(我也尝试过正则表达式和拆分单词“HomoloGene”的行):

import sys
ListOfLines = open(sys.argv[1])
for line in ListOfLines:
        if "HomoloGene" in line:
                if "HomoloGene" in ListOfLines.next():
                        print line
                        print "**"
                else:
                        print ListOfLines.next()

谢谢


Tags: inifparsesyslineprintgenemus
2条回答

这是一个由两部分组成的问题。首先将同源组extact到一个字典中,然后遍历这些组并打印成对的组。你知道吗

#!/bin/python
import re
# Opens the text file
with open("genes.txt","r") as f:
    data = {}
    # reads the lines
    for line in f.readlines():
        # When there is a : at the line start -> new group
        match = re.search("^([0-9]+):",line)
        if match:
            # extracts the group number and puts it to the dict
            group = match.group(1)
            # adds the species as entries with empty lists as values
            data[str(group)] = { "Homo_sapiens":[] , "Mus_musculus":[]}
        else:
            # splits the line (also removes the \n)
            text = line.replace("\n","").split()
            # if the species is in the group, add the gene name to the list
            if text[1] in data[group].keys():
                data[group][text[1]].append(text[0])
# Here you go with your parsed data
print data
# Now we feed it into the text format you want
print "Homo_sapiens\t\tMus_musculus"
# go through groups
for gr in data:
    # go through the Hs genes
    for hs_gene in data[gr]["Homo_sapiens"]:
        # get all the associated Ms genes
        for ms_gene in data[gr]["Mus_musculus"]:
            # print the pairs
            print hs_gene+"\t\t"+ms_gene

希望这有帮助。你知道吗

下面的注释代码在您的示例中生成结果。要理解它,您可能需要阅读以下内容:

代码:

import sys
import re
from collections import defaultdict
import itertools

#define the pairs of words we want to compare
compare = ['Homo_sapiens', 'Mus_musculus']

#define some regular expressions to split up the input data file
#this searches for a digit, a colon, and matches the rest of the line
group_re = re.compile("\n?\d+:.*\n")
#this matches non-whitespace, followed by whitespace, and then non-whitespace, returning the two non-whitespace sections
line_re = re.compile("(\S+)\s+(\S+)")

#to store our resulting comparisons
comparison = []

#open and read in the datafile
datafile = open(sys.argv[1]).read()
#use our regular expression to split the datafile into homolog groups
for dataset in group_re.split(datafile):
    #ignore empty matches
    if dataset.strip()=='': continue
    #split our group into lines
    dataset = dataset.split('\n')
    #use our regular expression to match each line, pulling out the two bits of data
    dataset = [line_re.match(line).groups() for line in dataset if line.strip()!='']
    #build a dictionary to store our words
    words = defaultdict(list)
    #loop through our group dataset, grouping each line by its word
    for v, k in dataset: words[k].append(v)
    #add the results to our output list. Note here we are unpacking an argument list
    comparison+=itertools.product(*[words[w] for w in compare])

#print out the words we wanted to compare
print('\t'.join(compare))
#loop through our output dataset
for combination in comparison:
    #print each comparison, spaced with a tab character
    print('\t'.join(combination))

相关问题 更多 >