ist die Regex, unter der Annahme, dass die Datei Text in txt
ist:
import re
m = re.search(r'^\s*description\s*=\s*(.*?)(?=(//)|$)', txt, re.M)
print(m.group(1))
Lassen Sie mich erklären. ^
Übereinstimmungen am Zeilenanfang. Dann \s*
bedeutet Null oder mehr Leerzeichen (oder Tabs) description
ist Ihr Anker für die Suche nach dem Wert Teil. Danach erwarten wir =
Zeichen mit optionalen Leerzeichen davor oder danach mit der Bezeichnung \s*=\s*
. Dann erfassen wir alles nach dem =
und optionalen Leerzeichen, indem wir (.*?)
bezeichnen. Dieser Ausdruck wird durch Klammern erfasst. Innerhalb der Klammer sagen wir, dass Sie alles (den Punkt) so oft wie möglich (das Sternchen) auf nicht-gierige Weise (das Fragezeichen) finden, dh stoppen, sobald der folgende Ausdruck übereinstimmt.
Der folgende Ausdruck ist ein Lookahead-Ausdruck, der mit (?=
beginnt, der der Sache unmittelbar nach dem (?=
entspricht. Und das Ding ist eigentlich zwei Optionen, getrennt durch die vertikale Leiste |
.
Die erste Option, links von der Leiste sagt //
(in Klammern, um es Atomeinheit für die vertikale Bar Wahl Operation machen), das heißt, der Beginn des Kommentars, die, ich nehme an, Sie nicht möchte erfassen. Die zweite Option ist $
, was das Ende der Zeile bedeutet, das erreicht wird, wenn in der Zeile kein Kommentar //
steht. Also suchen wir nach allem, was wir können nach dem ersten =
Zeichen, bis entweder wir treffen ein //
Muster, oder wir treffen das Ende der Linie. Dies ist die Essenz des (?=(//)|$)
Teils.
Wir müssen auch die re.M
Flagge, die Regex-Engine sagen, dass wir wollen ^
und $
den Anfang und das Ende von Zeilen entsprechen, respectively. Ohne das Flag passen sie den Anfang und das Ende der gesamten Zeichenfolge an, was in diesem Fall nicht das ist, was wir wollen.
Kommentare wurde von mir nur für Claryfying hinzugefügt: P – Kerbiter
Dies wird auch die Doc-Zeile übereinstimmen. – Kasramvd
Was ist die "Doc-Linie"? – RamenChef