555 Stimmen

Python string.replace regulärer Ausdruck

Ich habe eine Parameterdatei im folgenden Format:

parameter-name parameter-value

Die Parameter können in beliebiger Reihenfolge vorliegen, aber es gibt nur einen Parameter pro Zeile. Ich möchte den parameter-value eines Parameters durch einen neuen Wert ersetzen.

Ich verwende eine Funktion zum Ersetzen von Zeilen die zuvor gepostet wurde, um die Zeile zu ersetzen, die die string.replace(pattern, sub) von Python verwendet. Der reguläre Ausdruck, den ich verwende, funktioniert beispielsweise in vim, scheint jedoch in string.replace() nicht zu funktionieren.

Hier ist der reguläre Ausdruck, den ich verwende:

line.replace("^.*interfaceOpDataFile.*$/i", "interfaceOpDataFile %s" % (fileIn))

Wo "interfaceOpDataFile" der Parametername ist, den ich ersetze (/i für Groß-/Kleinschreibung ignorieren) und der neue Parameterwert der Inhalt der Variable fileIn ist.

Gibt es eine Möglichkeit, dass Python diesen regulären Ausdruck erkennt, oder gibt es einen anderen Weg, um diese Aufgabe zu erledigen?

738voto

Andrew Clark Punkte 193562

str.replace() v2|v3 erkennt keine regulären Ausdrücke.

Um eine Substitution mit einem regulären Ausdruck durchzuführen, verwenden Sie re.sub() v2|v3.

Zum Beispiel:

import re

line = re.sub(
           r"(?i)^.*interfaceOpDataFile.*$", 
           "interfaceOpDataFile %s" % fileIn, 
           line
       )

In einer Schleife wäre es besser, den regulären Ausdruck zuerst zu kompilieren:

import re

regex = re.compile(r"^.*interfaceOpDataFile.*$", re.IGNORECASE)
for line in some_file:
    line = regex.sub("interfaceOpDataFile %s" % fileIn, line)
    # arbeite mit der aktualisierten Zeile weiter

523voto

Sie suchen die re.sub Funktion.

import re
s = "Beispielstring"
ersetzt = re.sub('[ES]', 'a', s)
print(ersetzt)

wird axample atring ausgeben

20voto

kpie Punkte 8875

Als Zusammenfassung

import sys
import re

f = sys.argv[1]
find = sys.argv[2]
replace = sys.argv[3]
with open (f, "r") as myfile:
     s=myfile.read()
ret = re.sub(find,replace, s)   # <<< Hier passiert die Magie
print ret

11voto

Nelz11 Punkte 2671

re.sub ist definitiv das, wonach du suchst. Und so weißt du, du brauchst keine Anker und Platzhalter.

re.sub(r"(?i)interfaceOpDataFile", "interfaceOpDataFile %s" % filein, line)

wird dasselbe tun - das erste Teilzeichenfolge suchen, das wie "interfaceOpDataFile" aussieht, und es ersetzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X