Regex Anfängerproblem,Group gibt nur das erste element zurüc

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1531
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

problembär hat geschrieben:Wenn also jemand HTML mit RegEx parsen möchte, sag' ich, "laß' ihn doch" und helfe ihm so gut ich kann dabei, daß es technisch auch klappt.
sma hat gezeigt, wie es geht[*]. Seinen Beitrag habe ich jedoch als tongue-in-cheek verstanden. Ich denke also nicht, dass er dem OP tatsächlich empfiehlt, HTML mittels regex zu parsen, da das offensichtlich erheblich komplizierter ist, als einfach einen fertigen HTML-Parser zu verwenden. Insbesondere für jemanden, der noch nicht gelernt hat, was greediness ist. Das Parsen von HTML ist ein bereits gelöstes Problem. Man braucht einfach nur faul zu sein. Faulheit ist beim Programmierer eine Tugend.

Überhaupt verhält es sich so, wie Jamie Zawinski schrieb: Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

Desweiteren handelt es sich bei HTML um eine kontextsensitive Sprache, aber reguläre Ausdrücke eignen sich nur - der Name deutet es an - um reguläre Sprachen zu parsen. Beide Sprachen leben auf verschiedenen Ebenen der Chomsky-Hierarchie. Am überzeugendsten hat dies IMO bobince auf StackOverflow dargelegt.

Eine Möglichkeit zur Lösung des Problems des OPs wäre übrigens dies hier:

Code: Alles auswählen

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
for each in soup.findAll('description'):
    print each
Die Ausgabe ist dieselbe wie bei sma. Bei 4 XLOC, statt knapp 50.


[*]Der Parser von sma ist übrigens nicht wirklich in regex programmiert. Mit re zerlegt er nur den HTML-String in Tokens. Mithin handelt es sich um einen Scanner. Der Parser verwendet zwar diesen Scanner, aber er ist in Python programmiert.
In specifications, Murphy's Law supersedes Ohm's.
Antworten