Ik heb een parameterbestand van de vorm:
parameter-name parameter-value
Waarbij de parameters in elke volgorde mogen staan, maar er is slechts één parameter per regel. Ik wil de parameter-value
van een parameter vervangen door een nieuwe waarde.
Ik gebruik een regelvervangfunctie die eerder is gepost om de regel te vervangen die Python’s string.replace(pattern, sub)
. De reguliere expressie die ik gebruik werkt bijvoorbeeld in vim maar lijkt niet te werken in string.replace()
.
Hier is de reguliere expressie die ik gebruik:
line.replace("^.*interfaceOpDataFile.*$/i", "interfaceOpDataFile %s" % (fileIn))
Waar "interfaceOpDataFile"
de parameternaam is die ik vervang (/i voor niet-hoofdlettergevoelig) en de nieuwe parameterwaarde de inhoud is van de variabele fileIn
.
Is er een manier om Python deze reguliere expressie te laten herkennen of is er een andere manier om deze taak te volbrengen?
Antwoord 1, autoriteit 100%
str.replace()
v2|v3 doet reguliere expressies niet herkennen.
Als u een vervanging wilt uitvoeren met een reguliere expressie, gebruikt u re.sub()
v2| v3.
Bijvoorbeeld:
import re
line = re.sub(
r"(?i)^.*interfaceOpDataFile.*$",
"interfaceOpDataFile %s" % fileIn,
line
)
In een lus is het beter om eerst de reguliere expressie te compileren:
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
Antwoord 2, autoriteit 71%
Je zoekt de functie re.sub.
import re
s = "Example String"
replaced = re.sub('[ES]', 'a', s)
print replaced
print axample atring
Antwoord 3, autoriteit 3%
Als samenvatting
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
Antwoord 4, autoriteit 2%
re.sub
is zeker wat je zoekt. En dus weet je, je hebt de ankers en de wildcards niet nodig.
re.sub(r"(?i)interfaceOpDataFile", "interfaceOpDataFile %s" % filein, line)
zal hetzelfde doen: de eerste substring matchen die eruitziet als “interfaceOpDataFile” en deze vervangen.