J'ai un fichier de paramètres de la forme:
parameter-name parameter-value
Où les paramètres peuvent être dans n'importe quel ordre mais il n'y a qu'un paramètre par ligne. Je veux remplacer le parameter-value
d'un paramètre par une nouvelle valeur.
J'utilise une fonction de remplacement de ligne posté précédemment pour remplacer la ligne qui utilise Python string.replace(pattern, sub)
. L'expression régulière que j'utilise fonctionne par exemple dans vim mais ne semble pas fonctionner dans string.replace()
.
Voici l'expression régulière que j'utilise:
line.replace("^.*interfaceOpDataFile.*$/i", "interfaceOpDataFile %s" % (fileIn))
Où "interfaceOpDataFile"
est le nom du paramètre que je remplace (/ i si la casse est respectée) et la nouvelle valeur du paramètre correspond au contenu de la variable fileIn
.
Existe-t-il un moyen d'obtenir que Python reconnaisse cette expression régulière ou existe-t-il un autre moyen d'accomplir cette tâche?
str.replace()
v2 | v ne reconnaît pas les expressions régulières.
Pour effectuer une substitution à l'aide d'une expression régulière, utilisez re.sub()
. v2 | v.
Par exemple:
import re
line = re.sub(
r"(?i)^.*interfaceOpDataFile.*$",
"interfaceOpDataFile %s" % fileIn,
line
)
Dans une boucle, il serait préférable de compiler d'abord l'expression régulière:
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
Vous recherchez la fonction re.sub .
import re
s = "Example String"
replaced = re.sub('[ES]', 'a', s)
print replaced
va imprimer axample atring
En résumé
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
re.sub
est ce que vous recherchez. Et vous savez donc que vous n’avez pas besoin des ancres et des wildcards.
re.sub(r"(?i)interfaceOpDataFile", "interfaceOpDataFile %s" % filein, line)
fera la même chose - faire correspondre la première sous-chaîne qui ressemble à "interfaceOpDataFile" et la remplacer.