Luzandro hat geschrieben:
Wieso verwendest du hier eigentl. split? Der erste und der letzte Teil deiner Liste haben somit überhaupt nichts mit deiner Regex zu tun und sind nur der gesplittete Teil mit den einzelnen Gruppen dazwischen.
Exakt und ist auch so gewollt.
http://www.python-forum.de/post-57598.html#57598
Also ich habe verschiedene RegExp und verwende split auf den ganzen text. Vorfinden tu ich dann einzelne tokens die dann der Lexer überprüft und mit Type zurückgibt. Mehrdeutigkeiten kann der Lexer auch schon auflösen.
Deine Feststellung ist also schon so beabsichtigt.
Mal ein Beispiel:
Code: Alles auswählen
source = source = """test #link[test] **__test__**
foobar
"""
blex = BasisLexer(source)
# So würde das Ergebnis mit Split aussehen:
# ['test ', '#link', '[', 'test', ']', ' ', '**', '__', 'test', '__', '**', '\n', 'foobar', '\n']
print blex.source
#Der zusammengesetzte RegExp:
# (\*\*)|(//)|(__)|({{{)|(}}})|(#link)([ \t]*)(\[{1})([^\[\].]+)(\]{1})|(#image)([ \t]*)(\[{1})([^\[\].]+)(\]{1})|(\n)|(\r\n)
print blex.regexp_str
#...
#Der fertige lexer_stream
# [[('Literal', 'test ')], [('MarkupCommand', '#link'), ('TOCMD_OPENBR', '['), ('Literal', 'test'), ('TOCMD_CLOSBR', ']')], [('Literal', ' ')], [('MarkupBold', '**'), ('MarkupUnderline', '__'), ('Literal', 'test'), ('MarkupUnderline', '__'), ('MarkupBold', '**')], [('MarkupLinebreak', '\n')], [('Literal', 'foobar')], [('MarkupLinebreak', '\n')]]
# Darüber iteriert
for line in blex:
print line
# [('Literal', 'test ')]
#[('MarkupCommand', '#link'), ('TOCMD_OPENBR', '['), ('Literal', 'test'), ('TOCMD_CLOSBR', ']')]
#[('Literal', ' ')]
#[('MarkupBold', '**'), ('MarkupUnderline', '__'), ('Literal', 'test'), ('MarkupUnderline', '__'), ('MarkupBold', '**')]
#[('MarkupLinebreak', '\n')]
#[('Literal', 'foobar')]
#[('MarkupLinebreak', '\n')]
Also alles kein Problem
Luzandro hat geschrieben:Damit das '\n' nicht zu früh greift, müsstest du 're.DOTALL' aktivieren, damit auch ein Newline bei '.' gematcht wird, [...]
Ich glaube das hatte ich schon probiert und führte auch nicht zum gewünschten Ergebnis. Trotzdem danke für den Tipp. Werde es nochmal testen. Vielleicht habe ich da was übersehen gehabt.
@cracki:
Kodos habe ich schon lägst installiert. Das benutze ich auch ab und an zum testen. Aber das Programm kann mir keine RegExp generieren, das muss man immer noch selber machen. Daher ist das keine Lösung für mein Problem. Wollte eigentlich nur einen Anhaltspunkt wo der Fehler liegt..
@Birkenfeld:
birkenfeld hat geschrieben:sape hat geschrieben:
Oder mal anders: Ist es möglich reSTR mit RegExp zu tokenisieren? Mir geht es nicht um Sachen wie Einrückungen feststellen, etc. Das übernimmt ehe nachehr ein Parser bzw. Grammar der den Token-Strom kriegt.
Ich würde mal auf "nein" tippen. Aber
http://docutils.sourceforge.net/ sollte dir das besser beantworten können.
Man kann also reSTR nicht mit RegExp tokenisieren und ist "zu" Komplex?
Finde es interessant wenn man sich mal folgende Source von dir anschaut:
http://trac.pocoo.org/browser/pygments/ ... order=name
Ja, stimmt die RegExp macht nicht wirklich was ich gerne möchte:
Code: Alles auswählen
# Code blocks
499 (r'(::)(\n)((?:(?: +.*|)\n)+)',
500 bygroups(String.Escape, Text, String)),
501 include('inline'),
Mal jetzt Spaß bei Seite und mal ernst: Es geht also doch zu tokenisieren. Die Überprüfung der Syntax und Semantik muss nachehr ehe ein Parser übernehmen (Welcher macht das bei euch?), darum geht es aber auch nicht. Es geht erstmal ums triviale Tokenisieren und das geht ja anscheinend doch wie man an deinem Code sehen kann. Die RegExp von dir macht zwar nicht das was ich will, wird aber auf eurer interne Arbeitsweise eures Lexers/Parser angepasst sein.
Naja Brikenfeld, danke für die Information das man reSTR "nicht" tokenisieren kann
lg