2010-10-22 6 views
46

Je dois remplacer une partie d'une chaîne. Je regardais à travers la documentation Python et j'ai trouvé re.sub.Python: Remplacer par regex

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

>>>'Bar' 

Je m'y attendais pour imprimer '<textarea id="Foo">Bar</textarea>' et non 'bar'.

Quelqu'un pourrait-il me dire ce que j'ai fait de mal?

+3

La recommandation habituelle est que vous n'utilisez pas regex pour HTML. C'est une réponse de longue date sur ce site, avec quelques réponses classiques, aboutissant à celui-ci. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – hughdbrown

+0

Oui, je pensais utiliser regex car c'est vraiment un petit morceau mais je suis passé à BeautifulSoup au lieu. – Pickels

Répondre

79

Au lieu de capturer la partie que vous voulez remplacer vous pouvez capturer les pièces que vous voulez garder puis les consulter en utilisant une référence \1 pour les inclure dans la chaîne substitué.

Essayez ceci:

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

De plus, en supposant que cela est HTML que vous devriez envisager d'utiliser un analyseur HTML pour cette tâche, par exemple Beautiful Soup.

+0

Je pense que vous voulez dire 'r '\ 1Bar \ 3''. – nmichaels

+5

@Nathon - il n'y a pas de correspondance '\ 3'. Seulement deux d'entre eux entre parenthèses ... – eumiro

+0

Aha, je vois. Merci beaucoup Mark. – Pickels

1

Ou vous pouvez simplement utiliser la fonction de recherche à la place:

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