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.

257
demandé sur Community 2013-05-23 21:44:27

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
380
répondu Andrew Clark 2017-11-17 00:06:09

Vous recherchez le re.sous fonction.

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

Imprime axample atring

234
répondu Jacek Przemieniecki 2017-11-22 14:13:21

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
10
répondu kpie 2014-12-06 19:10:00

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.

8
répondu Nelz11 2013-05-23 18:10:17