2008-12-30 5 views
1

Comment puis-je faire correspondre un modèle tant qu'il ne se trouve pas dans une balise HTML?Regex qui ne correspond qu'au texte qui ne fait pas partie du balisage HTML? (python)

Voici ma tentative ci-dessous. Quelqu'un a une meilleure approche/différente?

import re 

inputstr = 'mary had a <b class="foo"> little loomb</b>' 

rx = re.compile('[aob]') 
repl = 'x' 

outputstr = '' 
i = 0 

for astr in re.compile(r'(<[^>]*>)').split(inputstr): 
    i = 1 - i 

    if i: 
     astr = re.sub(rx, repl, astr) 

    outputstr += astr 

print outputstr 

sortie:

mxry hxd x <b class="foo"> little lxxmx</b> 

Notes:

  • Le < [^>] *> modèle pour correspondre à des balises HTML est évidemment imparfait - je l'ai écrit rapidement et ne l'ai pas tenir compte de la possibilité de placer des chevrons entre des attributs cotés (par exemple, '< img alt = "suivant >"/>'). Il ne tient pas compte des tags ou des commentaires, soit <script> ou <style>.
+0

double: http://stackoverflow.com/questions/181095/regular-expression-to-extract-text-from-html –

+0

double: http://stackoverflow.com/questions/317053/regular-expression-for -extracting-tag-attributes –

+0

Je ne pense pas que ce soient des dupes autres que celles qui concernent à la fois les expressions régulières et le html –

Répondre

12

Depuis que vous utilisez Python de toute façon, si je vous, je serais un oeil à Beautiful Soup, qui est un analyseur Python HTML/XML. Vraiment, il y a tellement de cas spéciaux et de maux de tête avec l'écriture de votre propre analyseur, cela n'en vaut pas la peine. Votre expression régulière deviendra ingérable et ne produira toujours pas les résultats corrects dans tous les cas. Il suffit d'utiliser Beautiful Soup.

Questions connexes