2016-04-04 19 views
0

Hallo, ich bin neu bei Python, und ich hoffe, Sie können mir helfen. Ich habe eine Textdatei (nennen Sie es data.txt) mit Daten über die Gen-Nummer mit der entsprechenden RS-Nummer und etwas Abstandsmessung. Die Daten, sieht wie folgt aus:Extrahieren einer Zeichenfolge aus einer Textdatei in Python 2.7.5

rs1982171  55349  40802 

    rs6088650  55902  38550 

    rs1655902  3105  12220 

    rs1013677  55902  0 

, wo die erste Spalte rs-Nummer, die zweite Spalte ist Gen-Nummer, und die dritte Spalte ist etwas Abstandsmaß. Die Daten sind viel größer, aber das obige gibt Ihnen hoffentlich eine Vorstellung von dem Datensatz. Was ich tun möchte, ist, alle RS-Nummern zu finden, die einem bestimmten Gen entsprechen. Für den obigen Datensatz ist beispielsweise das Gen 55902 = {rs6088650, rs1013677}. Im Idealfall möchte ich, dass mein Code alle RS-Nummern findet, die einem bestimmten Gen entsprechen. Da ich nicht in der Lage bin, dass jetzt zu tun, schrieb ich stattdessen einen kurzen Code, den die Linien gibt, die die Zeichenfolge „55902“ in der data.txt Datei enthalten:

import re 
    data=open("data.txt","r") 
    for line in data: 
     line=line.rstrip() 
     if re.search("55902",line): 
     print line 

Das Problem mit diesem Code ist, dass der Ausgang so etwas wie dieses:

rs6088650 55902  38550 

    rs1655902 3105  12220 

    rs1013677 55902  0 

ich möchte meinen Code die Zeichenfolge "55902" in der rs-Nummer zu ignorieren. Mit anderen Worten, ich meine Code-Ausgabe nicht die zweite Zeile in der Ausgabe oben, weil die Gen-Nummer nicht 55902. ist, würde ich meine Ausgabe sein mag:

 rs6088650  55902 38550 

     rs1013677  55902 0 

Wie kann ich den obigen Code ändern, um erreiche was ich will. Jede Hilfe wäre willkommen. Danke im Voraus.

+0

Je nachdem, wie viele verschiedene Gene verwenden Sie für rs Zahlen zu sammeln, Sie wäre wahrscheinlich viel besser dran, all Ihre Daten in einen '' Pandas' '(http://pandas.org) 'DataFrame' zu ​​stecken und dort zu analysieren. – MattDMo

+0

Danke für den Vorschlag! –

Antwort

0

Hier sind keine regulären Ausdrücke erforderlich, da Sie nur eine einfache statische Sequenz suchen.Diese Zeile:

if re.search("55902",line): 

konnte wie folgt ausgedrückt werden:

if "55902" in line: 

Und wenn Sie nur die zweite Spalte überprüfen möchten, teilen Sie die Zeile zuerst:

if '55902' in line.split()[1]: 

Da Sie jetzt Überprüfen Sie bereits die richtige Spalte und prüfen Sie, ob eine Gleichheit vorhanden ist:

if line.split()[1] == '55902': 
0

können Sie word boundary (\b), verwenden Sie ganze Wortsuche zum Spiel:

>>> import re 
>>> re.search(r"\b55902\b", "rs1655902  3105  12220") 
>>> re.search(r"\b55902\b", "rs6088650  55902  38550") 
<_sre.SRE_Match object at 0x7f82594566b0> 

if re.search(r"\b55902\b", line): 
    .... 
0

Sie diese mit einem leistungsfähigeren regulären Ausdruck leicht tun können. Eine mögliche schnelle Lösung ist eine Regex der Form zu verwenden:

r'\b55902\b' 

Die \b sind Wortgrenzen.

0

Wenn Sie regex verwenden möchten, dann können Sie match oder search zusammen mit Wortgrenze \b als

x = " rs1982171  55349  40802".strip() 

if (re.match(r"\b55349\b", x.split()[1])): 
    print x 

IDEONE DEMO

Verwandte Themen