2017-11-28 7 views
0

Zuletzt meine Frage wie, (How can I get contents between square brackets by using regular expression?)was bedeutet es? über Python regulären Ausdruck

#start gene g1 
dog1 
dog2 
dog3 
#protein sequence = [DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD] 
#end gene g1 
### 
#start gene g2 
cat1 
cat2 
cat3 
#protein sequence = [CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 
#CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC] 
#end gene g2 
### 
#start gene g3 
pig1 
pig2 
pig3 
... 

Ich möchte bekommen Inhalt zwischen den Klammern und neue Datei mit dem Namen 50267.fa wie wie folgt

>g1_50267 
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD 
>g2_50267 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 
CCCCCCCCCCCCCCCCCCCC 
... 
war

und ich habe eine Antwort wie,

import re 

with open("50267.gff", "r") as ff: 
    matches = re.findall(r'\[([^\]]+)', ff.read()) 
    matches = ['>g' + str(ind+1) + "_50267\n" + x.replace('\n#', ' ') for ind, x in enumerate(matches)] 
#print(matches) 
with open('50267.fa', 'w') as fa: 
    fa.write("\n".join(matches)) 

Wenn ich mit diesem Code versuchte, funktionierte es gut. aber ich verstand nicht, was das folgende Codes bedeutet

r'\[([^\]]+)' 
x in enumerate(matches) 
+0

Wenn Sie sich auf eine Frage beziehen, die Sie zuvor online gestellt haben, wäre es gut, in Ihrem aktuellen Beitrag einen Link hinzuzufügen. – bli

Antwort

2

Lassen Sie uns die zwei Dinge betrachten, die Sie verwirrt sind.

Zuerst: r'\[([^\]]+)'. Dies ist ein roher String-Literal(). In diesem Kontext bedeutet "roh" nur, dass die umgekehrten Schrägstriche nicht von Pythons Compiler als Teil einer Escape-Sequenz interpretiert werden, sondern als tatsächliche Backslash-Zeichen. Das ist wichtig, weil die Regular Expression-Sprache auch Backslashes in ihren eigenen Escape-Sequenzen verwendet, und genau das wollen wir hier.

Der String \[([^\]]+) ist ein RegexMuster, die eine wörtliche [ Zeichen übereinstimmt (entkam mit einem Backslash, da eine Halterung sonst eine besondere Bedeutung hat, dass wir für einen Augenblick sehen werden), durch eine Erfassungsgruppe gefolgt (...) die eine oder mehrere enthält ...+ Zeichen aus einer bestimmten "Zeichenklasse" [...] (hier ist die andere Bedeutung in eckigen Klammern!). Diese Zeichenklasse ist ^... negiert, so dass es passt alles, nicht , eine schließende Klammer. (Der Backslash der Schließbügel entweichende eigentlich nicht erforderlich, da [^] keine gültige Zeichenklasse ist. Mit [^]] funktioniert genauso gut wie [^\]]. Einschließlich der Backslash harmlos ist though.)

Also das Muster passt Eingang, der mit beginnt eine öffnende eckige Klammer und erfasst dann ein oder mehrere Zeichen, die folgen, solange sie keine schließende Klammer sind.

Die andere Sache, die Sie durch verwirrt sind, ist for ind, x in enumerate(matches) (Ich habe ein etwas größeres großes des Codes herausgeschnitten, als Sie taten). Die enumerate-Funktion nimmt ein iterables Argument und gibt einen Iterator zurück, der index, item Zwei-Tupel liefert. Der erste Wert jedes Tupels ist eine ganze Zahl, die (standardmäßig) bei Null beginnt und einzeln hochzählt. Der zweite Wert ist ein Wert, der aus dem iterablen enumerate stammt.

Die for Schleife auspackt die Werte aus den Tupeln in Variablen namens ind und x, die es an anderer Stelle verwendet die Saiten für jede Zeile zu bauen, die in den Ausgang gehen. Die Indexnummer ind wird verwendet, um die Namen , g2 zu generieren, anstatt sie aus der Datei zu analysieren. Solange die Gen-Nummern in jeder Datei streng sequentiell sind, sollte das in Ordnung sein.

+0

danke !! es ist eine schöne Erklärung !! – tehoo

-1

die verwendet wird, Zeichenkombinationen in Strings entsprechen. Das obige Muster bedeutet

Detaillierte Erklärung dieses Musters (r'\[([^\]]+)'), finden Sie hier.

https://regex101.com/r/hSf8Up/1

x in enumerate(matches) 

Above-Code ist nur durch die Spiele via regulären Ausdrucks gefunden iterieren.