Cadena Python.reemplazar expresión regular [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Tengo un archivo de parámetros de la forma

parameter-name parameter-value

Donde los parámetros pueden estar en cualquier orden pero solo hay un parámetro por línea. Quiero reemplazar el valor de parámetro de un parámetro con un nuevo valor.

Estoy usando una línea reemplazar función publicada anteriormente ( Buscar y reemplazar una línea en un archivo en Python) para reemplazar la línea que usa la cadena de python.reemplazar (patrón, subst). La expresión regular que estoy usando funciona, por ejemplo, en vim, pero no parece funcionar en string.reemplazar. Aquí está la expresión regular que estoy usando:

line.replace("^.*interfaceOpDataFile.*$/i", "interfaceOpDataFile %s" % (fileIn))

Donde interfaceOpDataFile es el nombre del parámetro que estoy reemplazando (/i para mayúsculas y minúsculas) y el nuevo valor del parámetro es el contenido del fileIn variable. ¿Hay alguna manera de hacer que python reconozca esta expresión regular o hay otra manera de lograr esta tarea? Gracias de antemano.

 257
Author: Community, 2013-05-23

4 answers

str.replace() v2|v3 no reconoce las expresiones regulares.

Para realizar una sustitución usando una expresión regular, use re.sub() v2|v3.

Por ejemplo:

import re

line = re.sub(
           r"(?i)^.*interfaceOpDataFile.*$", 
           "interfaceOpDataFile %s" % fileIn, 
           line
       )

En un bucle, sería mejor compilar primero la expresión regular:

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
Author: Andrew Clark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 00:06:09

Usted está buscando el re.sub función.

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

Se imprimirá axample atring

 234
Author: Jacek Przemieniecki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-22 14:13:21

Como resumen

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
Author: kpie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-06 19:10:00

re.sub es definitivamente lo que estás buscando. Y para que lo sepas, no necesitas las anclas y los comodines.

re.sub(r"(?i)interfaceOpDataFile", "interfaceOpDataFile %s" % filein, line)

Hará lo mismo matching haciendo coincidir la primera subcadena que se parece a "interfaceOpDataFile" y reemplazándola.

 8
Author: Nelz11,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 18:10:17