Chaîne Python.remplacer l'expression régulière [dupliquer]
Cette question a déjà une réponse ici:
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 seul paramètre par ligne. Je veux remplacer la valeur de paramètre d'un paramètre par une nouvelle valeur.
J'utilise une ligne Remplacer fonction postée précédemment ( rechercher et remplacer une ligne dans un fichier en Python ) Pour remplacer la ligne qui utilise la chaîne de python.remplacer (motif, subst). L'expression régulière que j'utilise fonctionne par exemple dans vim mais ne semble pas fonctionner dans string.remplacer. 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 pour insensible à la casse) et la nouvelle valeur du paramètre est le contenu du fileIn variable. Est-il un moyen d'obtenir python à reconnaître cette expression régulière, ou y at-il un autre moyen pour accomplir cette tâche? Merci à l'avance.
4 réponses
str.replace()
v2|v3 ne pas reconnaître les expressions régulières.
Pour effectuer une substitution à l'aide d'une expression régulière re.sub()
v2|v3.
Par exemple:
import re
line = re.sub(
r"(?i)^.*interfaceOpDataFile.*$",
"interfaceOpDataFile %s" % fileIn,
line
)
Dans une boucle, il serait préférable de compiler l'expression régulière en premier:
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 le re.sous fonction.
import re
s = "Example String"
replaced = re.sub('[ES]', 'a', s)
print replaced
Imprime axample atring
Comme un 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 certainement ce que vous cherchez. Et donc vous savez, vous n'avez pas besoin des ancres et des caractères génériques.
re.sub(r"(?i)interfaceOpDataFile", "interfaceOpDataFile %s" % filein, line)
Fera la même chose-en faisant correspondre la première sous-chaîne qui ressemble à "interfaceOpDataFile" et en la remplaçant.