2011-11-07 34 views
8

Estoy intentando conseguir re.sub para reemplazar un patrón especificado con un valor por ejemplore.sub que no trabaja para mí

for lines in f: 
    pattern='\${2}'+key[0]+'\${2}' 
    re.search(pattern,lines) 

este retorno de la línea donde se encuentra el patrón. Por ejemplo, este es uno de los retornos de las pruebas si tiene

esta es una prueba $$ $$

El problema que estoy teniendo es cuando hago la siguiente

re.sub(pattern,key[1],lines) 

no pasa nada. ¿Qué me estoy perdiendo? Para obtener más información key[0]=test y key[1]=replace , entonces lo que estoy tratando de hacer es que cada vez que se encuentre "$$ test $$" lo reemplace por "replace". No tengo problemas para encontrar "$$ test $$" pero por alguna razón re.sub no lo está reemplazando.

+3

Cuando necesite almacenar una barra diagonal inversa en una cadena, es mejor utilizar la barra diagonal inversa doble. En su caso, funciona de todos modos en Python porque el signo de dólar no tiene un significado especial cuando se le agrega una barra invertida y porque Python en ese caso mantiene ambos caracteres, pero en otros idiomas escribir ''\ $'' significará '' $ ''. Cuando alguien está leyendo una cadena y descubre que una barra invertida espera algo especial u otra barra invertida. Si necesita muchas barras diagonales inversas en una cadena, entonces debe utilizar una cadena sin formato ... – 6502

+0

Para las personas que aterricen aquí con problemas generales de 're.sub', [asegúrese de que] (https://stackoverflow.com/questions/8813265/ why-doesnt-ignorecase-flag-re-i-work-in-re-sub) está pasando 're.IGNORECASE' como un argumento' flags = ', no el argumento' count'. – Noumenon

Respuesta

11

Usted es asignando el resultado de re.sub de nuevo a una variable, ¿no? p.ej.

lines = re.sub(pattern, key[1], lines) 

Es una cadena, por lo que no se puede cambiar (las cadenas son inmutables en Python), por lo tanto, se crea una nueva cadena y se le devolverá. Si no lo asigna a un nombre, lo perderá.

+0

ahhh pensé que lo reemplazó. ¿Cómo voy a reemplazar esta línea en un archivo? Por cierto, gracias por esto.No puedo creer que esto no se me haya ocurrido – aport002

+0

En un archivo, vas a leer cada línea desde un archivo de entrada y escribirla en un archivo de salida; al final, si lo desea, elimine el archivo original y cambie el nombre del archivo de salida. O si el archivo cabe en la memoria, puede leerlo en la memoria por completo, hacer los cambios y volver a escribirlo en el mismo archivo. Hay muchos ejemplos en SO y en otras partes de la Web para hacer esto en Python. – kindall

+0

Muchas gracias. Has sido de gran ayuda. – aport002

2

Si tiene un texto, puede ejecutar re.sub() directamente en todo el texto de la siguiente manera:

import re 

ss = '''that's a line 
another line 
a line to $$test$$ 
123456 
here $$test$$ again 
closing line''' 

print(ss,'\n') 

key = {0:'test', 1:'replace'} 

regx = re.compile('\$\${[0]}\$\$'.format(key)) 

print(regx.sub(key[1],ss)) 

.

Si se lee un archivo, debe tener interés para leer todo el archivo y ponerlo en un objeto ss antes runing re.sub() en él, en lugar de la lectura y la línea tras línea reemplazando

.

Y si usted tiene una lista de líneas, debe procesar la siguiente manera:

import re 

key = {0:'test', 1:'replace'} 

regx = re.compile('\$\${[0]}\$\$'.format(key)) 

lines = ["that's a line", 
     'another line', 
     'a line to $$test$$', 
     '123456', 
     'here $$test$$ again', 
     'closing line'] 

for i,line in enumerate(lines): 
    lines[i] = regx.sub(key[1],line) 

De lo contrario una línea que contiene 'prueba $$ $$' no se modificaría:

import re 

key = {0:'test', 1:'replace'} 

regx = re.compile('\$\${[0]}\$\$'.format(key)) 

lines = ["that's a line", 
     'another line', 
     'a line to $$test$$', 
     '123456', 
     'here $$test$$ again', 
     'closing line'] 

for line in lines: 
    line = regx.sub(key[1],line) 


print (lines) 

resultado

["that's a line", 'another line', 'a line to $$test$$', '123456', 'here $$test$$ again', 'closing line']