Ich habe einen einfachen Python-Code, der Dateien nach einer Zeichenfolge durchsucht, z. B. path=c:\path
wo der c:\path
Teil variieren kann. Der aktuelle Code lautet:
def find_path(i_file):
lines = open(i_file).readlines()
for line in lines:
if line.startswith("Path="):
return # what to do here in order to get line content after "Path=" ?
Was ist ein einfacher Weg, um den Text danach zu bekommen Path=
?
Antworten:
Ab
Python 3.9
können Sie verwendenremoveprefix
:quelle
Wenn die Zeichenfolge festgelegt ist, können Sie einfach Folgendes verwenden:
Dies gibt Ihnen alles ab Position 5 in der Zeichenfolge (eine Zeichenfolge ist auch eine Sequenz, sodass diese Sequenzoperatoren auch hier funktionieren).
Oder Sie können die Linie zuerst teilen
=
:Dann ist param "Path" und value ist der Rest nach dem ersten =.
quelle
split
eine Ausnahme ausgelöst, wenn das Trennzeichen nicht vorhanden ist.partition
ist stabiler, teilt auch eine Zeichenfolge und gibt immer ein Tupel mit drei Elementen mit Vor-, Trennzeichen und Nachinhalt zurück (einige davon können sein,''
wenn das Trennzeichen nicht vorhanden war). ZB ,value = line.partition('=')
.Entfernen Sie das Präfix aus einer Zeichenfolge
Beim ersten Auftreten des Separators über teilen
str.partition()
Analysieren Sie eine INI-ähnliche Datei mit ConfigParser
Andere Optionen
str.split()
re.match()
quelle
quelle
Für das Schneiden (bedingt oder nicht bedingt) im Allgemeinen bevorzuge ich, was ein Kollege kürzlich vorgeschlagen hat; Verwenden Sie Ersatz durch eine leere Zeichenfolge. Einfacher zu lesen, weniger Code (manchmal) und weniger Risiko, die falsche Anzahl von Zeichen anzugeben. OK; Ich benutze kein Python, aber in anderen Sprachen bevorzuge ich diesen Ansatz:
oder - um dem ersten Kommentar zu diesem Beitrag nachzugehen - wenn dies nur erfolgen soll, wenn die Zeile beginnt mit
Path
:Der Hauptunterschied zu einigen der oben vorgeschlagenen Punkte besteht darin, dass weder eine "magische Zahl" (5) beteiligt ist noch die Notwendigkeit besteht, sowohl '
5
' als auch die Zeichenfolge 'Path=
' anzugeben. Mit anderen Worten, ich bevorzuge diesen Ansatz gegenüber einer Codepflege Standpunkt.quelle
rightmost = re.sub('^Path=', '', fullPath)
. Der Zweck dercompile()
Methode besteht darin, die Dinge schneller zu machen, wenn Sie das kompilierte Objekt wiederverwenden. Da Sie es jedoch nach der Verwendung wegwerfen, hat es hier ohnehin keine Auswirkungen. Es lohnt sich normalerweise sowieso nicht, sich über diese Optimierung Gedanken zu machen.Ich ziehe
pop
die Indizierung vor[-1]
:zu
quelle
startswith
es bereits getestet wurde, sosplit
dass "nichts" vorher und alles andere danach geteilt wird.split("Path=", 1)
ist genauer (falls das Präfix später in der Zeichenfolge wieder erscheint), führt jedoch eine magische Zahl wieder ein.Oder warum nicht
quelle
Wie wäre es mit..
Dieses Triplett ist der Kopf, der Separator und der Schwanz .
quelle
Der einfachste Weg, den ich mir vorstellen kann, ist das Schneiden:
Ein kurzer Hinweis zur Slice-Notation: Es werden zwei Indizes anstelle des üblichen verwendet. Der erste Index gibt das erste Element der Sequenz an, die Sie in das Slice aufnehmen möchten, und der letzte Index ist der Index unmittelbar nach dem letzten Element, das Sie in das Slice aufnehmen möchten.
Z.B:
Das Slice besteht aus allen Elementen zwischen
first_index
undlast_index
, einschließlichfirst_index
und nichtlast_index
. Wenn der erste Index weggelassen wird, wird standardmäßig der Anfang der Sequenz verwendet. Wenn der letzte Index weggelassen wird, enthält er alle Elemente bis zum letzten Element in der Sequenz. Negative Indizes sind ebenfalls zulässig. Verwenden Sie Google, um mehr über das Thema zu erfahren.quelle
quelle
r''
Zeichenfolgen für Windows-Pfade. 2.re.match()
kann keine zurückgebenEin weiterer einfacher Einzeiler, der hier nicht erwähnt wurde:
Dies funktioniert auch ordnungsgemäß für verschiedene Randfälle:
quelle
gibt Ihnen Zeichen nach den ersten fünf.
quelle
line[5:]
gibt den gewünschten Teilstring. Durchsuchen Sie die Einführung und suchen Sie nach "Slice Notation".quelle
Wenn Sie Listenverständnis kennen:
quelle
line.startswith(...)
10x schneller zu sein. Meine Tests haben dies nicht bestätigt. Gerne ändern wir es, wenn Beweise für diese Behauptung vorliegen.Die Pop-Version war nicht ganz richtig. Ich denke du willst:
quelle
Warum nicht Regex mit Escape verwenden?
^
stimmt mit dem Anfangsteil einer Zeilere.MULTILINE
überein und stimmt mit jeder Zeile überein.re.escape
stellt sicher, dass die Übereinstimmung genau ist.quelle
Versuchen Sie folgenden Code
quelle
Ich denke, genau das, wonach Sie suchen
quelle
Ohne eine Funktion schreiben zu müssen, wird diese nach Liste aufgeteilt, in diesem Fall 'Mr. | Dr. | Mrs'. Wählen Sie alles nach dem Teilen mit [1] aus, teilen Sie es dann erneut und greifen Sie nach einem beliebigen Element. Im folgenden Fall wird 'Morris' zurückgegeben.
quelle
Dies ist in der Technik anderen Antworten sehr ähnlich, jedoch ohne wiederholte Zeichenfolgenoperationen, die Fähigkeit zu erkennen, ob das Präfix vorhanden war oder nicht, und dennoch gut lesbar:
quelle