Python string.replace reguliere expressie [duplicaat]

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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

17 + 7 =

Other episodes