2010-10-22 12 views
46

Necesito reemplazar parte de una cadena. Estaba revisando la documentación de Python y encontré re.sub.Python: reemplazar con regex

import re 
s = '<textarea id="Foo"></textarea>' 
output = re.sub(r'<textarea.*>(.*)</textarea>', 'Bar', s) 
print output 

>>>'Bar' 

me esperaba esto para imprimir '<textarea id="Foo">Bar</textarea>' y no 'bar'.

¿Alguien podría decirme qué hice mal?

+3

La recomendación habitual es que no utiliza expresiones regulares para HTML. Es una respuesta duradera en este sitio, con algunas respuestas clásicas que culminan en esta. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – hughdbrown

+0

Sí, estaba pensando en usar regex ya que es una pieza muy pequeña pero cambió a BeautifulSoup en lugar. – Pickels

Respuesta

79

En lugar de la captura de la parte que desea reemplazar puede capturar las partes que desea mantener y luego referirse a ellos utilizando una referencia \1 incluirlos en la cadena sustituido.

Tal vez puedas probar:

output = re.sub(r'(<textarea.*>).*(</textarea>)', r'\1Bar\2', s) 

Además, suponiendo que esto es HTML debe considerar el uso de un analizador de HTML para esta tarea, por ejemplo Beautiful Soup.

+0

Creo que te refieres a 'r '\ 1Bar \ 3''. – nmichaels

+5

@Nathon - no hay coincidencia '\ 3'. Solo dos de ellos en paréntesis ... – eumiro

+0

Aha, ya veo. Muchas gracias, Mark. – Pickels

1

O usted podría utilizar la función de búsqueda en su lugar:

match=re.search(r'(<textarea.*>).*(</textarea>)', s) 
output = match.group(1)+'bar'+match.group(2) 
print output 
>>>'<textarea id="Foo">bar</textarea>' 
Cuestiones relacionadas