我知道如何在两行之间解析,当开始“目标词”和结束“目标词”不同时
e.g。如果我想在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
我遇到了一个稍微不同的问题,我要解析的词是同一个词。即在这个例子中,有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比较:
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()
由于
答案 0 :(得分:3)
下面的注释代码会在您的示例中生成结果。要理解它,您可能需要阅读以下内容:
守则:
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))
答案 1 :(得分:1)
这是一个两部分问题。首先,您将同源组放入字典中,然后遍历各组并打印对。
#!/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
希望这有帮助。