web-dev-qa-db-de.com

Python string.replace regulärer Ausdruck

Ich habe eine Parameterdatei der Form:

parameter-name parameter-value

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

Ich benutze eine Zeilenersetzungsfunktion zuvor gepostet , um die Zeile zu ersetzen, die Pythons string.replace(pattern, sub) verwendet. Der reguläre Ausdruck, den ich verwende, funktioniert beispielsweise in vim, scheint aber in string.replace() nicht zu funktionieren.

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

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

Wobei "interfaceOpDataFile" der Parametername ist, den ich ersetze (/ i für die Unterscheidung zwischen Groß- und Kleinschreibung), und der neue Parameterwert der Inhalt der Variablen fileIn ist.

Gibt es eine Möglichkeit, Python zum Erkennen dieses regulären Ausdrucks zu bewegen, oder gibt es eine andere Möglichkeit, diese Aufgabe auszuführen?

356
Troy Rockwood

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

Verwenden Sie re.sub(), um eine Ersetzung mit einem regulären Ausdruck durchzuführen. v2 | v.

Zum Beispiel:

import re

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

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

import re

regex = re.compile(r"^.*interfaceOpDataFile.*$", re.IGNORECASE)
for line in some_file:
    line = regex.sub("interfaceOpDataFile %s" % fileIn, line)
    # do something with the updated line
494
Andrew Clark

Sie suchen nach der Funktion re .

import re
s = "Example String"
replaced = re.sub('[ES]', 'a', s)
print replaced 

druckt axample atring

329

Zusammenfassend

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)   # <<< This is where the magic happens
print ret
13
kpie

re.sub ist definitiv das, wonach Sie suchen. Sie brauchen also weder die Anker noch die Platzhalter.

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

wird das gleiche tun - den ersten Teilstring, der wie "interfaceOpDataFile" aussieht, abgleichen und ersetzen.

10
Nelz11