Seite 1 von 1

regular expression: Ich stehe auf dem Schlauch :(

Verfasst: Freitag 13. Mai 2011, 17:03
von Nebelhom
Hi,

ich wuerde gerne bei folgendem html text die anchor tags wegmachen mittels einer regular expression. Der unten gegebene string ist ein beispiel string, der sich meist in den Zahlen variiert.

Ich habe auch mal meinen Versuch einer regular expression gegeben, damit ihr sehen koennt, was ich denn bisher gemacht habe. Ein Tipp wie man das macht waere nett. Ich steh gerade seit unglaublichen 2 stunden auf dem Schlauch der Schlaeuche :?

Danke schonmal

Code: Alles auswählen

import re

# Beispiel String
line = '''<a href="/doi/abs/10.1021/ja2026882">Total Synthesis of (&#177;)-Cycloclavine and (&#177;)-5-<i>epi</i>-Cycloclavine</a>'''

regex = re.compile(r"""
                    </?             # Optional; Needed for </a>
                    a
                    (\W|\S)+?       # Optionally checks for any alphanumerical character or whitespace or none
                                    # Mistake most likely in this line...
                    >               # end delimiter
                    """, re.VERBOSE)

t = re.sub(regex, "", line)

print line  # vorher
print t     # nachher

Re: regular expression: Ich stehe auf dem Schlauch :(

Verfasst: Freitag 13. Mai 2011, 17:20
von BlackJack
@Nebelhom: Wenn es ordentlich gemacht werden soll nimmt man dafür keinen regulären Ausdruck und wenn es unsauber sein darf ebenfalls nicht — da ist ein regulärer Ausdruck unnötig kompliziert. Es gibt Parser für HTML und Operationen auf Zeichenketten wie Suchen von Teilzeichenketten von beiden Enden aus und Slicing.

Re: regular expression: Ich stehe auf dem Schlauch :(

Verfasst: Freitag 13. Mai 2011, 17:35
von Nebelhom
Oh :oops:

Wahrscheinlich habe ich solange weitergemacht, weil ich es unbedingt schaffen wollte, das ganze mit dem re modul zu loesen ;)

Danke trotzdem habe es jetzt geschafft, weil ich in der richtigen Ecke geschaut habe :P

Re: regular expression: Ich stehe auf dem Schlauch :(

Verfasst: Freitag 13. Mai 2011, 20:55
von problembär
Im Prinzip hat BlackJack natürlich recht, trotzdem ist das Entfernen von html-Tags mit einem regulären Ausdruck (wenn Du denn das gemeint hast) schon einigermaßen gebräuchlich, vor allem in Perl.
Wobei es da einen Trick gab, das heißt, man mußte etwas um die Ecke denken.
Googeln nach "html tags re perl" ergab dann:

Code: Alles auswählen

import re

line = '''<a href="/doi/abs/10.1021/ja2026882">Total Synthesis of (&#177;)-Cycloclavine and (&#177;)-5-<i>epi</i>-Cycloclavine</a>'''

regex = re.compile(r"""<([^>]|\s)*>""")

t = re.sub(regex, "", line)

print line  # vorher
print t     # nachher
Meintest Du das so?

Gruß

Re: regular expression: Ich stehe auf dem Schlauch :(

Verfasst: Freitag 13. Mai 2011, 22:56
von sma
Nebelhorns RE sagt: ein "<" gefolgt von einem "a" und dann mindestens ein Zeichen, das kein Buchstabe, keine Zahl und ein Whitespace ist und dann ein ">". Optional kann nach dem "<" noch ein "/" folgen. Das funktioniert so nicht. Die "\W|\S"-Regel ist IMHO falsch.

Am einfachsten wäre r"</?\s*a\b[^>]*?>", aber auch das versagt z.B. bei <a href='>'>.

Beim RE von Problembär ist das "\s" überflüssig, weil schon in "[^>]" enthalten. Außerdem findet das nicht nur "a"-Tags, sondern alles, was in spitzen Klammern steht. Und natürlich können auch hier durchaus erlaubte ">" in einem Attributwert stören.

HTML kann man nur korrekt mit einem HTML-Parser parsen.

Stefan

Re: regular expression: Ich stehe auf dem Schlauch :(

Verfasst: Freitag 13. Mai 2011, 23:14
von Nebelhom
@problembaer: Ja, ich wollte es einfach hinbekommen, mit einem regulaeren Ausdruck die Tags zu entfernen. Am Anfang dachte ich noch, "oh bugger, wie bekomme ich das denn hin?" und dann hatte ich mich in regular expressions verbissen und wollte das einfach nur hinbekommen, mehr um zu wissen, wie es aussieht als alles andere.

----
r"</?\s*a\b[^>]*?>"
some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems.

--Jamie Zawinski

Aber mal im ernst. Ich muss mir das nochmal anschauen. Das ist alles noch sehr schwer fuer mich zu verdauen ;)

Ich danke euch fuer eure Hilfe.