2010-10-22 16 views
46

Ho bisogno di sostituire parte di una stringa. Stavo guardando la documentazione di Python e ho trovato re.sub.Python: sostituire con regex

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

>>>'Bar' 

mi aspettavo questo per stampare '<textarea id="Foo">Bar</textarea>' e non 'bar'.

Qualcuno potrebbe dirmi cosa ho fatto di sbagliato?

+3

la solita raccomandazione è di non utilizzare espressioni regolari per HTML. È una risposta di lunga data su questo sito, con alcune risposte classiche, culminate in questo. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – hughdbrown

+0

Sì, stavo pensando di usare regex dato che è un pezzo veramente piccolo ma passato a BeautifulSoup anziché. – Pickels

risposta

79

Invece di catturare la parte che si desidera sostituire è possibile catturare le parti che si desidera mantenere e quindi fare riferimento a loro utilizzando un riferimento \1 per includerli nella stringa sostituito.

Prova a modificare:

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

Inoltre, sempre che sia HTML si dovrebbe considerare l'utilizzo di un parser HTML per questo compito, per esempio Beautiful Soup.

+0

Penso tu voglia dire 'r '\ 1Bar \ 3''. – nmichaels

+5

@Nathon - non esiste una corrispondenza '\ 3'. Solo due di loro in parentesi ... – eumiro

+0

Aha, vedo. Grazie mille Marco. – Pickels

1

Oppure si può semplicemente utilizzare la funzione di ricerca, invece:

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