Ist das mit regulären ausdrücken lösbar?
Verfasst: Montag 5. Februar 2007, 21:00
Häng an einem Problem fest.
http://docutils.sourceforge.net/docs/us ... ral-blocks
1. Vor einem :: dürfen Blanks, Tabs und auch Zeichen sein. Dahinter das gleiche bis auf Zeichen.
2. Danach muss eine Leerzeile folgen.
3. Es muss danach mindestens eine Zeile folgen die mit mindestens einem Leerzeichen eingerückt sein.
4. Falls danach mehrere Zeilen folgen, müssen die die gleiche Einrückgunstiefe haben wie die Zeile die in Punkt 3 beschrieben ist.
5. Als Abschluss muss eine Leerzeile folgen.
Was ich bis jetzt zusammengebastelt habe ist diese "Fehlerhaft" RegExp.
Das (\n) am ende greift zu früh
Punkt 3 und 4 geht logischerweise nicht mit RegExp, sondern müsste vom Lexer überprüft werden bzw. vom Parser
Soweit ich weiß kann man keine Einrückungen überprüfen mit RegExp.
Beispiele:
Hier sieht man das '\n' zu früh greift. Eigentlich muss erst solange (.*) abgearbeitet werden und dann erst (\n).
Also es müsste dan so aussehen:
Ist das überhaupt zu Lösen mit RegExp?
Weil bisher geht es bis auf das mit den (\n). -> Beweis:
Ansich funktioniert es also schon recht gut, bis auf...
Kann mir einer vielleicht sagen wo ich den Denkfehler gemacht habe?
Ich hoffe der Post ist verständlich für Die jenigen die sich mit dem Thema auskennen.
lg
http://docutils.sourceforge.net/docs/us ... ral-blocks
1. Vor einem :: dürfen Blanks, Tabs und auch Zeichen sein. Dahinter das gleiche bis auf Zeichen.
2. Danach muss eine Leerzeile folgen.
3. Es muss danach mindestens eine Zeile folgen die mit mindestens einem Leerzeichen eingerückt sein.
4. Falls danach mehrere Zeilen folgen, müssen die die gleiche Einrückgunstiefe haben wie die Zeile die in Punkt 3 beschrieben ist.
5. Als Abschluss muss eine Leerzeile folgen.
Was ich bis jetzt zusammengebastelt habe ist diese "Fehlerhaft" RegExp.
Code: Alles auswählen
([a-zA-Z0-9 \t]*)(::)\s*\n\s*\n(.*)(\n)

Punkt 3 und 4 geht logischerweise nicht mit RegExp, sondern müsste vom Lexer überprüft werden bzw. vom Parser

Beispiele:
Code: Alles auswählen
source = """test
foobar ::
test
test2
"""
TAGS_RE = re.compile(r'([a-zA-Z0-9 \t]*)(::)\s*\n\s*\n(.*)(\n)')
tokens = [x for x in TAGS_RE.split(source) if x != '' and x != None]
print tokens
# ['test\n', ' foobar ', '::', ' test', '\n', ' test2\n \n ']
Also es müsste dan so aussehen:
Code: Alles auswählen
['test\n', ' foobar ', '::', ' test\n', ' test2\n ', '\n', ' ']
Weil bisher geht es bis auf das mit den (\n). -> Beweis:
Code: Alles auswählen
source = """test
foobar ::
test
test2
"""
# Greift nicht, also i.O. -> ['test\n foobar ::\n test\n test2\n \n ']
source = """test
::
test
test2
"""
# Greift also i.O. -> ['test\n', ' ', '::', ' test', '\n', ' test2\n ']
source = """test
foobar ::
test
test2
"""
# Greift also i.O. -> ['test\n', ' foobar ', '::', ' test', '\n', ' test2\n \n ']
Kann mir einer vielleicht sagen wo ich den Denkfehler gemacht habe?
Ich hoffe der Post ist verständlich für Die jenigen die sich mit dem Thema auskennen.
lg