Parser-> finde "den" Reg Expression nicht!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Donnerstag 9. August 2007, 18:38

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!
BlackJack

Donnerstag 9. August 2007, 19:35

Welche Anführungszeichen!? In dem Beispiel sind keine.

Falls Du '1ATK_' und '1167' suchst sind die Ausdrücke 'PDB:([^ ]+)' und r'Score = (\d+)'.
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Freitag 10. August 2007, 09:07

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?
BlackJack

Freitag 10. August 2007, 10:32

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.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Freitag 10. August 2007, 10:46

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.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Freitag 10. August 2007, 12:48

mkallas hat geschrieben:benutzt du besser find.
Nicht find, sondern search.
MfG
HWK
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Freitag 10. August 2007, 12:56

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
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Freitag 10. August 2007, 13:53

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
BlackJack

Freitag 10. August 2007, 13:56

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)))
Antworten