Pyparsing: Ausdruck in Strings beliebiger Länge

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
zwfzwf
User
Beiträge: 3
Registriert: Freitag 4. Januar 2013, 13:46

Hallo... ich bin dabei einen boost::spirit Ausdruck unter Python zu implementieren und Versuche eine eigentlich sehr simple Grammatik mittels pyparsing zu formulieren... das klappt aber nicht: er parst den ersten Ausdruck (logisch, strings beliebiger Länge) bis zu Ende und kommt dann nicht weiter. Er geht nicht alle Pfade durch, ob er einen Match erhält.

Code: Alles auswählen

ident = MatchFirst( Group( CaselessLiteral( 's' ) + Word( nums, exact=2 ) + CaselessLiteral('e') + Word( nums, exact=2 ) ) )
grammar = OneOrMore( Word( printables ) ) + ident + OneOrMore( Word( printables ) )
Prinzipiell soll nur ein Identifier im String gesucht wird, der in der ersten Zeile beschrieben ist: z.B. s00e00

Alles davor möchte ich als einen Ausdruck bekommen, und alles danach auch. Die Frage ist: wie mache ich das? Hat jemand eine Idee wo das Problem ist?
lunar

@zwfzwf Reichen dafür nicht ganz gewöhnliche reguläre Ausdrücke?! Sprich etwas in der Art "re.search(r'(?P<before>.*)(?P<ident>s\d{2}e\d{2})(?P<after>.*)', s, re.UNICODE)"…
zwfzwf
User
Beiträge: 3
Registriert: Freitag 4. Januar 2013, 13:46

Prinzipiell mit Sicherheit... aber beim RegEx Tags betrachten knallt mir immer die Birne durch. :oops:

Das werde ich mal versuchen auszuprobieren... danke!
zwfzwf
User
Beiträge: 3
Registriert: Freitag 4. Januar 2013, 13:46

Das hat super funktioniert... vielen Dank! :)

Ich tue mich gerade noch schwer herauszufinden, wie ich den Term ausdrücke daß hier (?P<ident>s\d{2}e\d{2}) das "s" und das "e" sowohl groß alsauch klein geschrieben werden können.

EDIT: Hab es doch hingekriegt [sS] [eE]! Funktioniert sehr gut.
lunar

@zwfzwf "re.IGNORECASE" hätte es auch getan :)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Für diesen einfachen Fall reicht auch ein

Code: Alles auswählen

pattern = re.compile(r'(s\d{2}e\d{2})',re.I)
anfang, mitte, ende = pattern.split(text,1)
Antworten