Regex: MatchObject -> gefundenen Teilstring ausgeben?

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
jgillich
User
Beiträge: 16
Registriert: Donnerstag 15. September 2011, 16:20

Ich habe gerade wahrscheinlich eine Denkblockade, aber ich verstehe nicht so ganz wie ich den gefundenen Text eines Matchobjects ausgeben kann.

Code: Alles auswählen

pattern = re.compile('{"[0-9]*":{"[0-9]*":\[*".*":\[".*".*\]}},')
erg_string = pattern.search(driver.page_source)
if not erg_string:
    exit("fehler")
search() sucht nach einem String in einer Zeile (die seeeeeehr lang ist) und gibt ein MatchObject zurück. Wie kann ich nun den gefundenen Teilstring ausgeben? Ich finde in der Doku dazu überhaupt nichts (http://docs.python.org/library/re.html#re.MatchObject).
lunar

@jgillich: Ich freue mich, Dir die Dokumentation zur ".group()" vorlesen zu dürfen:
Returns one or more subgroups of the match. […] Without arguments, group1 defaults to zero (the whole match is returned). If a groupN argument is zero, the corresponding return value is the entire matching string; if it is in the inclusive range [1..99], it is the string matching the corresponding parenthesized group.
Beachte auch das schöne Beispiel in der Dokumentation.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

jgillich hat geschrieben:search() sucht nach einem String in einer Zeile (die seeeeeehr lang ist) und gibt ein MatchObject zurück. Wie kann ich nun den gefundenen Teilstring ausgeben? Ich finde in der Doku dazu überhaupt nichts (http://docs.python.org/library/re.html#re.MatchObject).
Du hast keine Gruppe definiert die gefangen werden soll. Wenn du den kompletten String haben willst, dann musst du den kompletten String in Klammern setzen.

Code: Alles auswählen

import re

pattern = re.compile('({"[0-9]*":{"[0-9]*":\[*".*":\[".*".*\]}},)')
match = pattern.search('invalid{"12":{"34":["foo":["bar"]}},invalid')
if match:
    print match.groups()
Möchtest du einzelne Bestandteile haben, dann setz die in Klammern.

Code: Alles auswählen

pattern = re.compile('{"([0-9]*)":{"([0-9]*)":\[*".*":\["(.*)".*\]}},')
Fürs Logbuch: Das war jetzt mein eintausendster Beitrag. :-)
lunar

@/me: Lies bitte die Dokumentation: Man braucht keine Gruppen, um die vollständige passende Zeichenkette abzufragen.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

lunar hat geschrieben:@/me: Lies bitte die Dokumentation: Man braucht keine Gruppen, um die vollständige passende Zeichenkette abzufragen.
Yes, Sir!

Ich war bei dem gezeigten regulären Ausdruck davon ausgegangen, dass im Endeffekt wahrscheinlich ohnehin nur Teile des Strings benötigt werden. Damit bin ich dann bei match.groups() gelandet und hatte nicht in Betracht gezogen, dass match.groups() nur die Subgroups ab Nummer 1 liefert und den kompletten String außen vor lässt. Ich halte den Ansatz mit Gruppen auch für flexibler.
jgillich
User
Beiträge: 16
Registriert: Donnerstag 15. September 2011, 16:20

lunar hat geschrieben:@jgillich: Ich freue mich, Dir die Dokumentation zur ".group()" vorlesen zu dürfen
Hm, verdammt. Ich sagte doch,
jgillich hat geschrieben:Ich habe gerade wahrscheinlich eine Denkblockade
Diese ganzen Regex machen mich noch wahnsinnig. Danke jedenfalls an euch beide. :wink:
Antworten