Seite 1 von 1

Parser-> finde "den" Reg Expression nicht!

Verfasst: Donnerstag 9. August 2007, 18:38
von acidk
Hallo Leute!
Ich versuche gerade einen Parser zu schreiben, der mir ein Blast Result aufstückelt. Text a` la:

Press ctrl-F to search in page. Press ctrl-A to copy all to clipboard
To zoom Press ctrl-plus/ctrl-minus or turn mouse wheel with ctrl-key

program-name=WU-blastp program-version=2.0MP-WashU [04-May-2006]
databases=[ name = pdb created = 2007-07-18T23:00:16+01:00]

1> PDB:1ATK_ mol:protein length:215 CATHEPSIN K

Score = 1167 (415.9), Expect = 4.3E-119
Identities = 100/215, Positives = 100/215

Q 1 APDSVDYRKKGYVTPVKNQGQCGSCWAFSSVGALEGQLKKKTGKLLNLSPQNLVDCVSEN 60 usw.
Ich möchte zwei Listen haben:
eine mit dem PDB Code(nur der Code, am besten nicht mal Anführungszeichen), sowie eine nur mit der Scoring Zahl (nur die Zahl).
Bei meinem kläglichen Versuch habe ich die störenden Reste mit "replace" entfernt...
:oops:
Mein Versuch:

Code: Alles auswählen

from re import*

re1 = compile("PDB:.+?\s")  
re2 = compile("Score.=.+\d")

handle= open("blast_1yk7_easy.txt") 
y =handle.read()
z =re1.findall(y)
j =re2.findall(y)
handle.close()
print z
print j
Hat von Euch jemand eine Idee?

Vielen Dank!

Verfasst: Donnerstag 9. August 2007, 19:35
von BlackJack
Welche Anführungszeichen!? In dem Beispiel sind keine.

Falls Du '1ATK_' und '1167' suchst sind die Ausdrücke 'PDB:([^ ]+)' und r'Score = (\d+)'.

Verfasst: Freitag 10. August 2007, 09:07
von acidk
Vielen Dank!

War genau was ich suchte!
Mit den Anführungszeichen meinte ich die Hochkommata '1ATK_' . Sie kommen ja nur in der Ausgabe vor - kann man sie auch noch irgendwie eliminieren?

Verfasst: Freitag 10. August 2007, 10:32
von BlackJack
Du musst die Zeichenketten direkt ausgeben und nicht ein Listenobjekt die Darstellung übernehmen lassen. Du gibst ja nicht die Zeichenketten aus, sondern die Liste, die die Zeichenketten enthält.

Verfasst: Freitag 10. August 2007, 10:46
von mkesper
acidk hat geschrieben:Mit den Anführungszeichen meinte ich die Hochkommata '1ATK_' . Sie kommen ja nur in der Ausgabe vor - kann man sie auch noch irgendwie eliminieren?
Du benutzt findall, das ist dafür gedacht, mehrere Ergebnisse zu liefern, die dann z.B. in einer for-Schleife ausgegeben werden. Gibt es nur ein Ergebnis, benutzt du besser find.

Verfasst: Freitag 10. August 2007, 12:48
von HWK
mkallas hat geschrieben:benutzt du besser find.
Nicht find, sondern search.
MfG
HWK

Verfasst: Freitag 10. August 2007, 12:56
von acidk
Eigentlich geht es darum, dass ich ichn riesiges Textfile habe - so um die 300 Treffer mit PDB Code und Scoring. Dazwischen Sequenz, die ich nicht brauche.

Ich dachte, dass ich mit "findall" eben all diese Treffer finde. Unter den Treffern sind viele, die zwar unterschiedliche PDB Codes, aber das gleiche Scoring haben -> diese will ich herausfiltern, weiß aber noch nicht genau wie.

Zunächst habe ich aus den beiden Listen ein Dict. gemacht. Kann ich hieraus nun eine Menge generieren, sodass ich jeden Score nur einmal drin habe?
:K

Verfasst: Freitag 10. August 2007, 13:53
von HWK
Wie wäre es z.B. so:

Code: Alles auswählen

dic = {'PDB1':'Score1', 'PDB2':'Score2', 'PDB3':'Score1', 'PDB4':'Score3',
     'PDB5':'Score2', 'PDB6':'Score4', 'PDB7':'Score7', 'PDB8':'Score4'}
new_dic = {}
for key, val in dic.items():
    new_dic.setdefault(val, []).append(key)
print new_dic
MfG
HWK

Verfasst: Freitag 10. August 2007, 13:56
von BlackJack
Und welchen PDB Code soll es zu dem Score dann geben? Wenn das egal ist, dann kannst Du ein Dictionary mit dem Score als Schlüssel und dem Code als Wert erzeugen. Dann "gewinnt" einfach der Code, der als letztes unter einem Score-Wert eingetragen wurde.

Folgende ungeteste Funktion sollte ein Dictionary liefern, was Scores als Schlüssel und jeweils einen passenden Code als Wert enthält:

Code: Alles auswählen

import re
from itertools import imap, izip


def extract_scores(text):
    code_re = re.compile(r'PDB:([^ ]+)')
    score_re = re.compile(r'Score = (\d+)')
    return dict(izip(imap(int, score_re.finditer(text)),
                     code_re.finditer(text)))