2017-03-10 2 views
0

Dies ist die Struktur der txt-Datei (wiederholte Einheiten von CDS-text-ORIGIN):Python Regex - Capture Text zwischen zwei Wörtern als String, hängen Sie dann zur Liste

 CDS    311..>428 
        /gene="PNR" 
        /codon_start=1 
        /product="photoreceptor-specific nuclear receptor" 
        /protein_id="AAD28302.1" 
        /db_xref="GI:4726077" 
        /translation="METRPTALMSSTVAAAAPAAGAASRKESPGRWGLGEDPT" 
ORIGIN 

Ich möchte, dass die ziehen Text von 311 .. < 428 „als String Die Regex ich bisher müssen GEDPT ist:

compiler = re.compile(r"^\s+CDS\s+(.+)ORIGIN.+", re.DOTALL|re.MULTILINE) 

ich dann in eine Schleife verwenden, um jede Zeichenfolge in eine Liste hinzuzufügen:

for line in file: 
    match = compiler.match(line) 
    if match: 
     list.append(str(match.group(1))) 

Aber ich bekomme immer eine leere Liste! Irgendwelche Ideen warum?

Hilfe wäre sehr willkommen, ich bin neu dazu!

Antwort

1

Ich gehe davon aus, dass file ein Dateizeiger wie file = open('filename.txt') ist. Wenn dies der Fall ist, dann wird mit:

for line in file: 

wird jede Zeile auf dem Newline-Zeichen zu brechen. So sind die ersten drei Zeilen sind:

1: '  CDS    311..>428\n' 
2: '      /gene="PNR"\n' 
3: '      /codon_start=1:\n' 

Da jede Linie getrennt ist, werden Sie nicht das mehrzeilige Muster entsprechen, es sei denn Sie die Linien verbinden. Möglicherweise möchten Sie Folgendes in Betracht ziehen:

compiler = re.compile(r"^\s+CDS\s+(.+?)ORIGIN", re.DOTALL|re.MULTILINE) 
fp = open('filename.txt') 
all_text = fp.read()   # this reads all the text without splitting on newlines 
compiler.findall(all_text) # returns a list of all matches 
Verwandte Themen