Regular Expressions - Findet Ausdruck nicht

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
kingcools
User
Beiträge: 12
Registriert: Montag 17. März 2014, 04:03

Hi,

will mir n Tool schreiben, dass mich an meine ausgeliehenen Bücher erinnert. Dazu suche ich im Quelltext der Büchereiseite nach den Rückgabedaten.
Da hängt es derzeit.
Folgendes Programm soll in einem Ausschnitt des Codes das Rückgabedatum finden. Leider wird das entsprechende Konstrukt nicht gefunden.

Hier der Code (Python 2.7):

Code: Alles auswählen

# -*- coding: cp1252 -*-
import re

line = '<label for="R2465772"> Antimuslimischer Rassismus</label></td><td width="10%">Kuhn, Inva</td><td width="1%" align="right"></td><td width="18%">115$003 119 112L</td><td width="11%">31/03/2015</td><td width="11%">\n\n 28/04/2015 \n\n</td></tr>                                      <tr valign="top" style="background:white">'


matchObj = re.match('\d\d / \d\d / \d\d\d\d', line)

if matchObj:
   print "matchObj.group() : ", matchObj.group()

else:
   print "No match!!"
[Code=python file=Untitled.py]
[/code]
Es sollte das "28/04/2015" gefunden werden, erhalte aber die Ausgabe "No match!!". Wieso ist dem so? Das entspricht doch genau "Ziffer Ziffer/ Ziffer Ziffer/ Ziffer Ziffer Ziffer Ziffer"?!
Danke für jede Hilfe!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

In XML-Dokumenten mit regulären Ausdrücken zu suchen ist eine ganz schlechte Idee. Verwende dazu am besten geeignete Bibliotheken wie lxml oder Beautiful Soup. Damit kommst du leichter und vor allem zuverlässig an die Information.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

kingcools hat geschrieben:Das entspricht doch genau "Ziffer Ziffer/ Ziffer Ziffer/ Ziffer Ziffer Ziffer Ziffer"?!
"31/03/2015" != "31 / 03 / 2015"

Grundsätzlich schließe ich mich aber EyDu an. Verwende einen geeigneten Parser wie beispielsweise BeautifulSoup um die gewünschten Daten aus dem Dokument zu extrahieren.
kingcools
User
Beiträge: 12
Registriert: Montag 17. März 2014, 04:03

Danke, ich schaus mir an. Denke allerdings das in diesem Falle RE durchaus schneller sind.
Und
"31/03/2015" != "31 / 03 / 2015" ist mir schon klar, nur ist ZifferZiffer/... schlechter zu lesen
BlackJack

@kingcools: Man kann Brot auch mit einer Motorsäge schneiden. Geht schneller als mit einem Brotmesser. Geht aber auch schneller und gründlicher schief wenn man Pech hat weil es eben das falsche Werkzeug ist. Zum Beispiel finded der reguläre Ausdruck alle Stellen die wie ein Datum aussehen, man möchte ja aber sicherlich nur die haben die in einer bestimmten Spalte in der Tabelle stehen.

Und ob das nun schlechter zu lesen ist ändert ja nichts daran das es falsch ist. Wenn im Text die Leerzeichen nicht sind, dann gehören sie an der Stelle halt auch nicht ins Muster. Wobei ich das jetzt auch nicht wirklich schlechter lesbar finde. Die '\d' werden ja in einer anderen Farbe dargestellt als das '/'. Falls nicht sollte man den Editor wechseln oder die Einstellungen ändern.
kingcools
User
Beiträge: 12
Registriert: Montag 17. März 2014, 04:03

Ist mir schon klar, es gibt nur auf dieser Seite nichts anderes als die Ausleihdaten in diesem Format. Mit BeautifulSoup säße ich übermorgen noch dran.

Habs nun mit den Regular Expressions hinbekommen, lag übrigens an (natürlich) eigener Dummheit, denn a) findet match() nur an Satzanfängen entsprechende Muster und b) musste ich um alle zu finden findAll() verwenden.

Danke, kann zu.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das ist doch ein wenig kurzfristig gedacht. Natürlich wirst du jetzt mit BeautifulSoup für dein erstes Problem eine Stunde länger dran sitzen, alle weiteren derartigen Probleme lassen sich anschließend aber deutlich eleganter und effizienter lösen. Du wirst dann aber wieder bei REs hängen. Ich wäre mich auch nicht so sicher, dass deine Lösung funktioniert. Ein Datum ist durchaus ein Format, welches spontan hier und dort auf Seiten mal unerwartet auftaucht. Und dann fangen die Probleme an.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@kingcools: es geht ja wahrscheinlich nicht nur um das Finden des Datums, sondern um den Titel des Buches auch und das finden der Zeile in der Tabelle und und und.
Jetzt sag nicht, das machst Du alles über reguläre Ausdrücke!
Benutzeravatar
sparrow
User
Beiträge: 4599
Registriert: Freitag 17. April 2009, 10:28

Ich sehe in dem Beispieltext schon alleine 2 Treffer, was deiner Aussage widerspricht, dass es nur 1 Datum gibt.

Ich bin der Meinung, dass es nur wenige Situationen gibt, die den Einsatz von regulären Ausdrücken rechtfertigen. Die Komplexität ist einfach zu groß.

Die Lösung mit einer entsprechenden Bibliothek wäre in meinen Augen eleganter (weil nachvollziehbarer) und hätte nur einen Bruchteil der Zeit gekostet.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@sparrow: Da will ich Dir widersprechen: wer reguläre Ausdrücke beherrscht kann in den richtigen Situationen die Komplexität stark reduzieren. Aber in diesem Fall hast Du natürlich vollkommen recht :D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Über welche Komplexität redet ihr jetzt? Die von regulären Ausdrücken selber oder fachliche? Ich habe das Gefühl, dass ihr jeweils eine andere Form meint... ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
kingcools
User
Beiträge: 12
Registriert: Montag 17. März 2014, 04:03

Ich sehe in dem Beispieltext schon alleine 2 Treffer, was deiner Aussage widerspricht, dass es nur 1 Datum gibt.
Wo schreibe ich etwas von nur einem Datum? Nirgendswo.
Edit:
Du scheinst das andere Datum im Textbeispiel zu meinen. Nun, wenn du meine Beiträge liest sollte klar werden, dass ich alle Daten in der genannten Form auslesen möchte. Daraus kannst du schließen, dass ich das zweite Datum im Beispieltext schlicht übersehen habe. Natürlich möchte ich auch das auslesen.
Ich bin der Meinung, dass es nur wenige Situationen gibt, die den Einsatz von regulären Ausdrücken rechtfertigen. Die Komplexität ist einfach zu groß.
So allgemein halte ich die Aussage für Unsinn.
Die Lösung mit einer entsprechenden Bibliothek wäre in meinen Augen eleganter (weil nachvollziehbarer) und hätte nur einen Bruchteil der Zeit gekostet.
Wieso nur einen Bruchteil der Zeit gedauert? Wenn man diese (ominöse) Bibliothek schon beherrscht, dann sicherlich. Selbiges gilt aber auch für meine RE-Lösung. Daher auch kein Argument.


es geht ja wahrscheinlich nicht nur um das Finden des Datums, sondern um den Titel des Buches auch und das finden der Zeile in der Tabelle und und und.
Nein, es geht mir zuerst nur im die Daten. Sollte ich das Tool weiterentwickeln (oder sollte sich etwas wesentliches an der Seite ändern) taste ich mich an BeautifulSoup heran.
Das ist doch ein wenig kurzfristig gedacht. Natürlich wirst du jetzt mit BeautifulSoup für dein erstes Problem eine Stunde länger dran sitzen, alle weiteren derartigen Probleme lassen sich anschließend aber deutlich eleganter und effizienter lösen.
Das ist sicherlich richtig, nun habe ich ja eine Anlaufstelle für zukünftige Probleme, bei denen mein Ansatz an seine Grenzen stößt. Erfahrungsgemäß läuft (m)eine Entwicklung, wenn man direkt zu sehr verallgemeinert (darunter fällt bei mir dein Ansatz, mögen wir in der Hinsicht verschiedener Ansichten sein) ins Nichts, da nie etwas fertig wird. Es läuft jetzt mit meinem Ansatz. Von dieser Version kann ich in Zukunft, wenn ich Lust habe, ausgehen und sie verbessern. Falls es dich beruhigt, lass dir sagen, dass ich dabei auch BeautifulSoup berücksichtigen werde.

Allgemein ein klassischer Programmier"fehler" statt einer ersten spezielleren Lösung direkt eine allgemeinere zu programmieren und auf dem Weg sich immer weiter in Details zu verhaspeln.
Mache ich schlicht nicht mehr so, da wie oben geschrieben, zumindest bei mir nie was fertig wird (und nach Erfahrung anderer Leute aus dem C-PlusPlus-Forum das bei diesen auch verbreitet zu sein scheint).
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

kingcools hat geschrieben:Nein, es geht mir zuerst nur im die Daten. Sollte ich das Tool weiterentwickeln (oder sollte sich etwas wesentliches an der Seite ändern) taste ich mich an BeautifulSoup heran.
You can't parse [X]HTML with regex.
kingcools
User
Beiträge: 12
Registriert: Montag 17. März 2014, 04:03

/me hat geschrieben:
kingcools hat geschrieben:Nein, es geht mir zuerst nur im die Daten. Sollte ich das Tool weiterentwickeln (oder sollte sich etwas wesentliches an der Seite ändern) taste ich mich an BeautifulSoup heran.
You can't parse [X]HTML with regex.
Da gehts doch um etwas völlig anderes, lies es doch mal selber. Die RE "\d\d/\d\d/\d\d\d\d" existiert nicht in HTML oder irgendeiner mir bekannten Programmiersprache und kann somit nur als Textausgabe dienen. Müßige Diskussion.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@kingcools: wer einen Hammer hat, sieht überall nur Nägel. Natürlich hast Du hier HTML. Und zwar eine Tabelle. Erste Spalte Buchtitel, zweite Spalte Autor, dritte Spalte Kennung, vierte Spalte Ausleihdatum, fünfte Spalte Rückgabedatum. Also wird jeder, der nicht durch Hammer (Reguläre Ausdrücke) verblendet ist, da auch Spalten auslesen wollen und nicht nach Mustern suchen.
BlackJack

@kingcools: Ich halte Dein Programm so für fehlerhaft. Es geht hier nicht darum eine allgemeinere Lösung zu programmieren sondern eine *robuste* Lösung die nicht sofort auf die Nase fällt wenn man sie mal kurz anhustet. Du hast ja selber schon ein Datum in Deinen Beispieldaten übersehen, und dann gesagt wir sollten davon ausgehen das Du das auch auslesen wolltest. Davon ist aber erst einmal keiner ausgegangen weil es eben sehr leicht passieren kann, dass da noch ein unvorhergesenes Datum irgendwo auftaucht, oder etwas anderes auf das Muster passt. Es kann Buchtitel mit einem Datum im Namen geben, zum Beispiel bei Zeitschriften oder zusammengefassten Papers von Tagungen und Kongressen. Das Muster könnte sogar auf Sachen zutreffen die gar kein Datum repräsentieren, zum Beispiel Teile von URLs.
kingcools
User
Beiträge: 12
Registriert: Montag 17. März 2014, 04:03

@kingcools: wer einen Hammer hat, sieht überall nur Nägel. Natürlich hast Du hier HTML. Und zwar eine Tabelle. Erste Spalte Buchtitel, zweite Spalte Autor, dritte Spalte Kennung, vierte Spalte Ausleihdatum, fünfte Spalte Rückgabedatum. Also wird jeder, der nicht durch Hammer (Reguläre Ausdrücke) verblendet ist, da auch Spalten auslesen wollen und nicht nach Mustern suchen.
Woher kommt jetzt schon wieder die Idee, ich würde abstreiten, dass HTML vorliegt? Oder ist das unglücklich formuliert von dir?
@kingcools: Ich halte Dein Programm so für fehlerhaft. Es geht hier nicht darum eine allgemeinere Lösung zu programmieren sondern eine *robuste* Lösung die nicht sofort auf die Nase fällt wenn man sie mal kurz anhustet. Du hast ja selber schon ein Datum in Deinen Beispieldaten übersehen, und dann gesagt wir sollten davon ausgehen das Du das auch auslesen wolltest. Davon ist aber erst einmal keiner ausgegangen weil es eben sehr leicht passieren kann, dass da noch ein unvorhergesenes Datum irgendwo auftaucht, oder etwas anderes auf das Muster passt. Es kann Buchtitel mit einem Datum im Namen geben, zum Beispiel bei Zeitschriften oder zusammengefassten Papers von Tagungen und Kongressen. Das Muster könnte sogar auf Sachen zutreffen die gar kein Datum repräsentieren, zum Beispiel Teile von URLs.
Richtig, die Fälle könnten auftreten. Bis das passiert (bzw. falls es passiert bevor ich Lust habe das weiterzuentwickeln) bleibe ich bei meiner funktionierenden Lösung. (Ich persönlich leihe mir entsprechende Paper nur bei der Unibibliothek aus, welche automatische Erinnerungen per Mail verschickt, dieser Fall ist schon mal ohne Interesse)
Hartes Overengineeren in meinen Augen. Fehlerlose (nicht trivale) Programme gibt es nicht.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@kingcools: Dein Ansatz ist fehlerhaft. Unter einem Deutschaufsatz würde stehen: Thema verfehlt. Und sich jetzt rausreden, dass es keine Fehlerfreien Programme gibt zählt nicht, weil es hier nicht um das Programm an sich geht, sondern den Algorithmus. Die triviale und fehlerfreie Vorgehensweise wäre einen HTML-Parser zu nehmen und die Tabellenstruktur zu nutzen.
BlackJack

@kingcools: Du behandelst HTML wie Text und nicht wie man HTML behandelt. In sofern streitest Du ab das Du HTML hast, statt Text der zufällig wie HTML aussieht.

Du redest hier eine nicht funktionierende Lösung schön. Das es keine fehlerfreien Programme gibt ist ein unsinniges Totschlagargument. Das zieht auch nur für Fehler die man nicht kennt. Denn wenn man einen Fehler erkannt hat, dann ist es sehr wohl möglich den zu beheben. Insbesondere wenn der einfach zu beheben ist, in dem man zum Beispiel die passende Technik verwendet, sieht ein verteidigen der kaputten ”Lösung” nach Faulheit oder reflexartigem Rechtfertigungsversuch einer schlechten Entwurfentscheidung um jeden Preis aus.
kingcools
User
Beiträge: 12
Registriert: Montag 17. März 2014, 04:03

@kingcools: Dein Ansatz ist fehlerhaft. Unter einem Deutschaufsatz würde stehen: Thema verfehlt. Und sich jetzt rausreden, dass es keine Fehlerfreien Programme gibt zählt nicht, weil es hier nicht um das Programm an sich geht, sondern den Algorithmus. Die triviale und fehlerfreie Vorgehensweise wäre einen HTML-Parser zu nehmen und die Tabellenstruktur zu nutzen.
Ein Vorgehen kann abstrakt nicht fehlerfrei sein, dass macht keinerlei Sinn. Fehlerfrei kann erst die Umsetzung sein, daher leider nicht sonderlich klug geschissen. Jetzt wird es allerdings albern.
In sofern streitest Du ab das Du HTML hast, statt Text der zufällig wie HTML aussieht.
Das glaubst du doch selber nicht. Wenn mir ein chinesischer Text vorliegt und ich die Zahlen auslesen möchte, dann schreibe ich die Zahlen, diese sind arabisch, einfach ab und lerne nicht erst Chinesisch. Dadurch behaupte ich aber nicht implizit, dass mir kein Chinesisch vorliegt. Es interessiert mich nur einfach nicht bei der Lösung. Deine Aussage ist eine Unterstellung, die du nachfolgend als wahr annimmst um es mir dann vorzuwerfen. Absoluter Unfug.
Du redest hier eine nicht funktionierende Lösung schön.
Die Lösung funktioniert. Wir können uns jetzt gerne über die Definition von "funktionieren" unterhalten, finde ich aber langweilig. Mach nen eigenen Thread auf, falls dich das interessiert.
Du redest hier eine nicht funktionierende Lösung schön. Das es keine fehlerfreien Programme gibt ist ein unsinniges Totschlagargument. Das zieht auch nur für Fehler die man nicht kennt. Denn wenn man einen Fehler erkannt hat, dann ist es sehr wohl möglich den zu beheben. Insbesondere wenn der einfach zu beheben ist, in dem man zum Beispiel die passende Technik verwendet, sieht ein verteidigen der kaputten ”Lösung” nach Faulheit oder reflexartigem Rechtfertigungsversuch einer schlechten Entwurfentscheidung um jeden Preis aus.
Als würde ich mit Mauern reden. Ich habe die Gründe für die Wahl meiner Lösung bzw. Beibehaltung meiner Lösung dargelegt. Wenn du zu faul bist diese zu lesen oder dies ignorierst, dann kann ich dir nicht helfen.

Klassische Programmiererdiskussion hier. Ich bin nun raus, ein Tipp:

Ihr hättet wesentlich konstruktiver helfen können, hättet ihr einfach z.B. geschrieben:
"Deine Variante funktioniert nicht, da du statt findall() die Methode match() verwendest. Deine Variante findet die Daten mittels findall("meine RE").
Aber es ist deutlich weniger fehleranfällig, wenn du den HTML-Code mittels z.B. BeautifulSoup parst. Damit hast du auch in Zukunft einen besseren Stand."

Höherer Informationsgehalt, wesentlich konstruktiver rübergebracht, denn es löst auch direkt den gegenwärtigen Ansatz, zeigt aber den Ausblick auf die im allgemeinen bessere Lösung.
Wieso ich meinen Lösungsweg nun erstmal bevorzuge habe ich bereits dargelegt, aber andere Motive als die eigenen scheint ihr/einige hier nicht zu akzeptieren.
Das man eine Lösung im Nachhinein noch ändern kann, solltet ihr wissen. Das im Entwicklungsprozess nicht sofort die optimale Lösung stehen muss, auch. Für mich als nicht BeautifulSoupkenner hätte es an einer Stelle, für die ich eine schnelle Lösung suchte, absolut keinen Sinn gemacht, noch ein extre Fass mit dem Einarbeiten in BeautifulSoup aufzumachen. Nichts hindert mich daran, dies später noch zu ändern.
Wieso ihr so sehr darauf fixiert seid, die im allgemeinen bessere Lösung zu verwenden ist mir unklar. Meine Variante funktioniert tadellos, der "Buch mit Datum im Titel"-Fall ist extrem unwahrscheinlich (ich leihe mir schlicht derartiges nicht (in der Stadtbücherei) aus) und dafür sehe ich es nicht ein beim ersten Entwurf mit der Kanone auf Spatzen zu schießen.

So und mehr sage ich dazu nicht. Danke dennoch für den BeautifulSoup-Hinweis.
Antworten