regular expression: Ich stehe auf dem Schlauch :(

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

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
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.
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

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
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ß
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

@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.
Antworten