Reguläre Ausdrücke

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
anachronist
User
Beiträge: 2
Registriert: Montag 30. März 2009, 13:10

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

gut zum üben = http://kodos.sourceforge.net/, verwende ich auch
the more they change the more they stay the same
anachronist
User
Beiträge: 2
Registriert: Montag 30. März 2009, 13:10

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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

dafür gibts BeautifulSoup oder lxml als html-parser
the more they change the more they stay the same
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@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.
Das Leben ist wie ein Tennisball.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

jo parsen, man kann aber damit auch urls finden
the more they change the more they stay the same
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dav1d hat geschrieben:jo parsen, man kann aber damit auch urls finden
Wie denn das? Innerhalb von `<a>` als `href` Attribut?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
Zuletzt geändert von Dav1d am Mittwoch 23. September 2009, 15:27, insgesamt 1-mal geändert.
the more they change the more they stay the same
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hi.

Hier geht es aber mehr oder weniger um Freitext nicht um HTML. Da funktioniert das auf dem Weg nicht.
Das Leben ist wie ein Tennisball.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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).
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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?
the more they change the more they stay the same
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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
Zuletzt geändert von /me am Donnerstag 24. September 2009, 12:01, insgesamt 1-mal geändert.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Übrigens werden von den allen Ausdrücken keine https-URLs gematcht...

Manchmal wünschte ich, das HTTP STARTTLS könnte...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten