2017-02-08 7 views
0

Meine große tabstoppgetrennte Datei mit Text vor und nach, redigiertFilter aus Linien Regex

chr3Av1G678.1 chr2Bv1G678.9 
chr1Av1G978.6 chr1Bv1G456.1 
chr2Av1G123.4 chr2Bv1G678.3 
chr1Av1G456.0 chr2Av1G784.22 

mit Wie aus der Datei 1A-1B und 2A-2B abzuzufiltrieren? Damit ich nur 3A 2B habe und 1A 2A

import re 
import sys 
f=open('input.txt','r') 
r=open('output.txt','w') 
for line in f.readlines(): 
    line = line.split() 
    if not (?) re.search(r'text1Av1', line[0]) and not (?) re.search(r'text1Bv1', line[1]): 
     r.write("\t".join(line)+"\n") 
f.close() 
r.close() 
+1

Warum filtern Sie "1A 1B" und "2A 2B" aus? Liegt es daran, dass die Nummer am Anfang jedes Buchstabens gleich ist? – asongtoruin

+0

Ihre Filterbedingung ist nicht wirklich klar. Unter welchen Bedingungen möchten Sie Linien gefiltert? – kamikaze

+0

Was möchten Sie behalten und was möchten Sie verlassen? Was sind die Kriterien? – Toto

Antwort

1

Einfache Lösung, wenn Sie Ihren Text behalten und nur die zwei Zeilen herausfiltern möchten.

UPDATE Regex!

import re 
import sys 
with open('input.txt','r') as f, open('output.txt','w') as r: 
    for line in f: 
     if None is re.search(r'^chr[12]Av1G\d+\.\d+\s*chr[12]Bv1G\d+\.\d+$',line): 
      r.write(line) 
+0

können Sie Ihre '[12] A \ s * [12] B' erklären, also kann ich modifizieren, weil, wie ich oben sagte, meine Zeilen nicht nur 1A-1B enthalten, sondern textA1v1number text1Bv1number – user3224522

+1

[12] bedeutet '1' und '2' gelten Zeichen, ein Mittel 'A', \ s * bedeutet eine beliebige Anzahl von Leerzeichen, [12] wie erster Zeile, und B bedeutet 'B' ein gutes Werkzeug, um Ihren regex zu validieren selbst: http://pythex.org/ – KCoon

+0

Vielleicht können Sie ein "vollständiges" Beispiel Ihrer Eingabe und Ausgabe veröffentlichen, um Ihnen zu helfen, eine gute Regex zu finden, die zu Ihren Daten passt. – KCoon

1

Angenommen, Sie möchten Linien halten, wo Sie eine Reihe dann A oder B haben, dann unmittelbar nach (zB nach einem Reiter) eine andere Zahl, gefolgt von A oder B, sollte die folgende Arbeit:

import re 

with open('input.txt', 'r') as f: 
    read_lines = f.readlines() 

with open('output.txt', 'w') as o: 
    for line in read_lines: 
     get_digits = re.match(r'.*(\d)+[AB]\s+(\d)+[AB].*', line, re.DOTALL) 
     if get_digits: 
      if get_digits.group(1) != get_digits.group(2): 
       o.writelines(line) 

Dies schreibt output.txt die Zeilen, die 3A 2B und 1A 2A enthalten.

verallgemeinern dies weiter, können Sie die Regex ändern könnten:

re.match(r'.*(\d)+[A-Z]\s+(\d)+[A-Z].*', line, re.DOTALL) 

, das für jeden Großbuchstaben zulassen würde, nicht nur A und B.

1

Sie es wie so tun können:

import re 

with open('input', 'r') as f, open('output', 'w') as f2: 
    ftemp = f.read() 
    for a in range(1,4): 
     res = '-'.join(sorted(set(re.findall(r'{}[A-Z]'.format(a), ftemp)))) 
     print res 
     f2.write(res) 

Ausgabe von print res:

1A-1B 
2A-2B 
3A 

Schritt:

Erstellen Sie ein Objekt range() mit den Zahlen, die Sie aus der Datei erfassen möchten. Dann suchen Sie nach diesen Zahlen + 1 Caps Alphabet in der Datei.