web-dev-qa-db-fra.com

Python string.replace expression régulière

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))

"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?

356
Troy Rockwood

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
494
Andrew Clark

Vous recherchez la fonction re.sub .

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

va imprimer axample atring

329

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
13
kpie

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.

10
Nelz11