2016-11-16 2 views
0

Ich versuche, mehrere Male Worte in HTML-Tags zu erhalten. Für instace wie folgt aus:Python Regex Unter mehrere Male

<title>GateUser UserGate</title> 

ich beide 'GateUser' Cath wollen und 'Usergate' ich das nächste regexp bin mit:

re.sub(ur'(<.*>.*)(\b\w{8}\b)(.*</.*>)', r'\1\g<2>ADDED\3', html) 

Ich möchte jedes Wort ersetzen, innerhalb html Tag, der diese \b\w{8}\b Bedingung match, re nur eins erlaubt.

+2

Hand 're.sub' einen vierten Parameter:' re.GLOBA L'. klar – L3viathan

+0

nicht, können Sie bitte etwas näher erläutern? Möchten Sie beide Wörter oder irgendetwas innerhalb des Tags ersetzen? –

+1

Regex und HTML passen nicht gut zusammen ([obligatorischer Link] (https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)). Warum verwenden Sie keinen HTML-Parser, um den Textinhalt des Tags zu erhalten, und modifizieren Sie nur diesen? – mata

Antwort

1

Mit re für das Parsen von HTML nicht wirklich notwendig, da sie, dass viele brillant geschriebene Bibliotheken zu tun haben, aber immer noch eine Art und Weise können Sie erreichen, was Sie wollen von:

  • Parsing-Tags.
  • ihre innerhtml ändern.

Lassen Sie uns sagen Sie einige html haben:

a = """ 
    <title>GateUser UserGate</title> 
    <div style="something"> 
    KameHame Ha 
    </div> 
    """ 

Jetzt können Sie relativ leicht analysieren die Tags einschließlich der innerhtml:

blanks = r"([\s\n\t]+?)" # totally optional depending on code indentation and stuff. 
pat = re.compile(r"(<.+>){0}(.*?){0}(</.+>)".format(blanks)) 

# tuples don't support item assignment, so mapping list, but still tuples fine too. 
tags_with_inner = list(map(list, pat.findall(a))) 

# [ ['<title>', '', 'GateUser UserGate', '', '</title>'], 
# ['<div style="something">', '\n ', 'KameHame Ha', '\n ', '</div>']] 

Und dann regex auf der inneren nur entsprechen:

only_inner = re.compile(r"\b\w{8}\b") # your expression 

for inner in tags_with_inner: 
    inner[2] = only_inner.sub("ADDED", inner[2]) 
    print ("".join(inner)) 

# <title>ADDED ADDED</title> 
# <div style="something"> 
#  ADDED Ha 
# </div> 
+0

Ok. Wie kann ich Original-HTML bekommen, aber mit ersetzten Dingen? Das ist die Hauptsache, die mich wörtlich –

+0

gut, es ist besser, html/xml Parser Module dafür zu verwenden, ou machen nur Dinge schwierig für Sie. Versuchen Sie das Modul 'lxml' auf pypi, Sein hübscher Abstieg. –