Seite 1 von 1

Reguläre Ausdrücke

Verfasst: Dienstag 22. September 2009, 14:50
von anachronist
Hallo Community,

ich beschäftige mich neuerdings mit Regulären ausdrücken. davon habe ich allerdings noch nicht sehr viel ahnung. ich habe folgenden string:

IN
MSG
1253551933
1253551948
Hallo

Diesen möchte ich erstmal feststellen, also IN MSG, das bleibt jeweils gleich, danach kommen zwei timestamps und dann eine zeichenfolge, ich habe leider keine ahnung, wie ich die timestamps und den folgende zeichenfolge in variablen bekomme.

Mein Ansatz:
rg = re.compile('[IN] [MSG] ([0-9]+) ([0-9]+) ([a-z])')
m = rg.search(string)
if m:
timestamp1=m.group(1)
timestamp2=m.group(2)
zeichenfolge=m.group(3)


kann mich jemand von euch beraten, was ich für einen reg_exp benutzen sollte? vielen dank

Verfasst: Dienstag 22. September 2009, 15:03
von EyDu
Hallo.

Hast du dir mal die Dokumentation zum [mod]re[/mod]-Modul durchgelesen? Oben steht die Syntax beschrieben, ganz unten findest du auch noch jede Menge Beispiele.

Du hast hier gleich mehrere Probleme: "[IN]" bedeutet nicht, dass du nach "IN" suchst, sondern nach "I" oder "N". Mit den eckigen Klammern beschreibst du Mengen. "[a-z]" steht auch für genau ein Zeichen, nicht einen beliebig langen Text. Auch die Zeilenumbrüche müssen bei dir noch beachtet werden.

Arbeite dich erstmal ganz langsam an das Thema ran und versuche einfache Sachen zu finden. Anschließend kannst du deinen Ausdruck schrittweise aufbauen.

Google sollte dir bei regulären Ausdrücken auch helfen, die Syntax ist in allen Sprachen mehr oder weniger identisch.

Verfasst: Dienstag 22. September 2009, 15:05
von Dav1d
gut zum üben = http://kodos.sourceforge.net/, verwende ich auch

Verfasst: Dienstag 22. September 2009, 16:45
von anachronist
mit dem programm und der doku ging das ja super einfach, vielen dank ;-)

bei mir siehts jetzt so aus:

IN\nMSG\n([0-9]+)\n([0-9]+)\n(.+)

muss ich nur noch einen guten reg_exp bauen, der URLS erkennen kann, bzw finden

Verfasst: Dienstag 22. September 2009, 17:05
von Dav1d
dafür gibts BeautifulSoup oder lxml als html-parser

Verfasst: Dienstag 22. September 2009, 17:54
von EyDu
@Dav1d: die sind zum Parsen gedacht, nicht zum finden von URLs.

@anachronist: Das Forum und auch Google sollten da schon einige Ergebnisse liefern. Alle URLs exakt zu erfassen wird auf jeden Fall ein interessanter Ausdruck, dir reicht aber wahrscheinlich einer, der alle häufigen URLs findet.

Verfasst: Mittwoch 23. September 2009, 13:54
von Dav1d
jo parsen, man kann aber damit auch urls finden

Verfasst: Mittwoch 23. September 2009, 14:11
von cofi
Dav1d hat geschrieben:jo parsen, man kann aber damit auch urls finden
Wie denn das? Innerhalb von `<a>` als `href` Attribut?

Verfasst: Mittwoch 23. September 2009, 14:40
von Dav1d
so:

Code: Alles auswählen

>>> from BeautifulSoup import BeautifulSoup
>>> html = u'<td width="100%">
<a href="post-147655.html#147655">
<img src="templates/subSilver/images/icon_minipost.gif" width="12" height="9" alt="Beitrag" title="Beitrag" border="0" /></a>
<span class="postdetails">Verfasst am: Di Sep 22, 2009 14:50<span class="gen"> </span>
   Titel: Regul\xc3\xa4re Ausdr\xc3\xbccke</span>
</td>\n<td valign="top" nowrap="nowrap">
<a href="posting.php?mode=quote&p=147655">
<img src="templates/subSilver/images/lang_german/icon_quote.gif" alt="Antworten mit Zitat" title="Antworten mit Zitat" border="0" /></a>
 </td>\n'
>>> soup = BeautifulSoup(html)
>>> ablocks = soup.findAll('a')
>>> hrefs = []
>>> for i in ablocks:
	hrefs.append(soup.find('a')['href'])

	
>>> hrefs
[u'post-147655.html#147655', u'post-147655.html#147655']
vllt zu umständlich

Verfasst: Mittwoch 23. September 2009, 14:44
von EyDu
Hi.

Hier geht es aber mehr oder weniger um Freitext nicht um HTML. Da funktioniert das auf dem Weg nicht.

Verfasst: Mittwoch 23. September 2009, 15:26
von Dav1d
wie schauts mit:

Code: Alles auswählen

http://[w]{0,3}[.]?[\w-]+[.][a-z]{0,3}
aus?


das Enzigste was mir da nicht gefällt ist das [w]{0,3} da, falls es 2mal vorkommt auch dazu zählt

Verfasst: Mittwoch 23. September 2009, 15:42
von cofi
Dav1d hat geschrieben:wie schauts mit:

Code: Alles auswählen

http://[w]{0,3}[.]?[\w-]+[.][a-z]{0,3}
aus?
Nein, der Ansatz ist viel zu naiv. `info` (und schon gar nicht `museum`) als TLD wird nicht abgedeckt. Und das Protokoll zaehlt gar nicht zur URL. Subdomains werden nicht abgedeckt und Unterverzeichnisse/Dateien auch nicht.

Aber je nachdem welche URLs der OP bearbeiten muss, reicht ein einfacher Ansatz (er sollte aber mal damit rausruecken).

Verfasst: Donnerstag 24. September 2009, 06:42
von Dav1d
bin selber noch ziemlch schlecht in res nd wils lernen, wie schaut mit:

Code: Alles auswählen

http://[w]{0,3}[.]?[\w, ., -]+[.][a-z]{0,3}[/]?[\w, /, -]+[., \w]+
aus?

Verfasst: Donnerstag 24. September 2009, 10:29
von Leonidas
Der [w]{0,3}[.]? Part ist völlig überflüssig, da URLs auch mit anderen Buchstaben, gefolgt von einem Punkt anfangen können, etwa http://programming.reddit.com. Außerdem scheint es Kommas zu matchen, die ebenso wie Spaces in Domainnamen nicht zulässig sind. Fliegt auch mit TLDs wie .info, .aero, .name, .museum auf die Nase, außerdem gibt es keine Null und Einbuchstaben-TLDs.

Verfasst: Donnerstag 24. September 2009, 11:42
von /me
Ich bin jetzt spontan auf so etwas gekommen:

Code: Alles auswählen

r'(http://([\w\d-]+\.)+[\w\d]{2,}(/.+?)?)\s'
Edit: ein verrutschtes Fragezeichen korrigiert

Verfasst: Donnerstag 24. September 2009, 11:54
von HWK
Leonidas hat geschrieben:Außerdem scheint es Kommas zu matchen, die ebenso wie Spaces in Domainnamen nicht zulässig sind.
Die Wirkung des Ausdrucks war Dav1d wahrscheinlich nicht bewusst. Vermutlich hat er Kommas und Leerzeichen als Trenner gedacht. Auch die [] mit nur einem Buchstaben sind ja ungewöhnlich. Wahrscheinlich sollte auch Dav1d erst einmal EyDus Vorschlag zum Lesen der re-Doku beherzigen.
MfG
HWK

Verfasst: Freitag 25. September 2009, 10:45
von Leonidas
Übrigens werden von den allen Ausdrücken keine https-URLs gematcht...

Manchmal wünschte ich, das HTTP STARTTLS könnte...