Vous pouvez trouver les discordances en utilisant la méthode .find
d'une chaîne. Les discordances sont indiquées par un espace (''), donc nous cherchons cela dans la ligne médiane de la sortie blat. Je ne sais pas blat personnellement, donc je ne suis pas sûr si la sortie vient toujours dans les lignes triplet, mais en supposant que ce soit le cas, la fonction suivante retournera une liste de positions incompatibles, chaque position représentée comme un tuple de la position mésappariée dans la séquence supérieure et la même dans la séquence inférieure.
blat_src = """00000001 taaaagatgaagtttctatcatccaaaaaatgggctacagaaacc 00000045
<<<<<<<< ||||||||||||||||||||||||||| |||||||||||||||| <<<<<<<<
41629392 taaaagatgaagtttctatcatccaaagtatgggctacagaaacc 41629348"""
def find_mismatch(blat):
#break the blat input into lines
lines = blat.split("\n")
#give some firendly names to the different lines
seq_a = lines[0]
seq_b = lines[2]
#We're not interested in the '<' and '>' so we strip them out with a slice
matchstr = lines[1][9:-9]
#Get the integer values of the starts of each sequence segment
pos_a = int(seq_a[:8])
pos_b = int(seq_b[:8])
results = []
#find the index of first space character, mmpos = mismatch position
mmpos = matchstr.find(" ")
#if a space exists (-1 if none found)
while mmpos != -1:
#the position of the mismatch is the start position of the
#sequence plus the index within the segment
results.append((posa+mmpos, posb+mmpos))
#search the rest of the string (from mmpos+1 onwards)
mmpos = matchstr.find(" ", mmpos+1)
return results
print find_mismatch(blat_src)
Qui produit
[(28, 41629419), (29, 41629420)]
spécifié nous positions 28 et 29 (indexées conformément à la séquence du haut) ou des positions 41629419 et 41629420 (indexées conformément à la séquence du bas) ne correspondent pas.
Voulez-vous la position dans la séquence du haut ou du bas? Tous les deux? – sirlark
Je le veux de la séquence du bas. – user3783999