Seite 1 von 1

Komplizierten Regulären Ausdruck vereinfachen?

Verfasst: Donnerstag 23. Juli 2009, 15:25
von Dauerbaustelle
Hallo Leute,

ich bin grade dabei, eine Markupsprache zu entwerfen (auf re-Basis) und wollte dabei Blöcke nach diesem Schema hier matchen:

Code: Alles auswählen

{% blockname arguments %}blockcontent{% end blockname %}
wobei `arguments` dem Schema

Code: Alles auswählen

key=value
folgt.

Beispiele:

Code: Alles auswählen

{% code %}some code{% end code %}

{% code lang=js %}document.getElementByID('foo')...{% end code %}

{% code lang=py show_line_numbers=false %}def foo(bar): return bar{% end code %}
Dabei ist folgender Reguläre Ausdruck herausgekommen:

Code: Alles auswählen

return "{%% %(name)s%(args)s %%}(?P<c>%(p)s){%% end %(name)s %%}" % {
            'name' : name,
            'p' : pattern,
            'args': '' if not args else ''.join(
                ('( (%s)=(?P<%s>[^ ]+))?' % (arg, arg) for arg in args))
        }
wobei `name` zB für `code` steht und `p` für das Pattern für den Blockinhalt, zB `.+?`.

Meine Frage jetzt: Kann man den Ausdruck irgendwie vereinfachen? Das sieht nämlich ziemlich komisch aus alles.

Grüße

PS: Nein, ich will keine anderen libraries verwenden wie pyparsing oder so Faxen.

Verfasst: Donnerstag 23. Juli 2009, 15:29
von DasIch
Was passiert wenn jemand die Blöcke verschachtelt? Du kannst dass so nicht mit regulären Ausdrücken parsen, du musst dir schon einen Parser für so etwas schreiben. Du könntest dir dafür ja mal jinja2 oder Pygments ansehen.

Verfasst: Donnerstag 23. Juli 2009, 15:45
von ms4py
Warum entwirfst du die Sprache nicht auf Basis von XML, dann hast du auch kein Problem das ganze zu parsen?! Sieht ja eh schon aus wie XML.

Oder du lässt es so wie es ist, machst

Code: Alles auswählen

s.replace('{*', '<').replace('*}', '>') 
und verarbeitest s dann als XML ;)

Verfasst: Donnerstag 23. Juli 2009, 15:50
von Dauerbaustelle
ROFL :D

Naja, wo bleibt denn da der Programmierspaß ;)

Verfasst: Samstag 25. Juli 2009, 15:00
von sma
Wenn du schachteln willst, reichen reguläre Ausdrücke nicht, sie sind nicht mächtig genug. Ansonsten schaue meine Beiträge zu Template-Engines hier im Forum an oder auch dies hier.

Stefan