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 Soweit ich weiß kann man keine Einrückungen überprüfen mit RegExp.
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