Seite 1 von 1
Strategie zum Einlesen eines flat-files / regexp
Verfasst: Mittwoch 1. Oktober 2008, 21:47
von arghargh
Nachdem ich gemerkt habe, dass es ungünstig ist, Markup/HTML in XML zu speichern, möchte ich nun ein noch einfacheres Format benutzen.
Leider bekomm ich das nicht hin:
Code: Alles auswählen
import re
data = """text=hallo
newline
nochwas=sdsd
ui
"""
p = re.compile(r'^(\w+)=(.*?)', re.MULTILINE | re.DOTALL)
s = p.findall(data)
print s
>>[('text', ''), ('nochwas', '')]
# soll sein:
# [('text', 'hallo\n\nnewline'), ('nochwas', 'sdsd\n\nui')]
Aber vielleicht gibt es ja sowieso ein wesentlich besseres Verfahren?
Verfasst: Donnerstag 2. Oktober 2008, 07:13
von str1442
Du könntest CSV oder das Konfigurationsdateienformat (*.ini) verwenden, sieht nachdem aus, was du suchst. Siehe Standardbilbiothek.
Verfasst: Donnerstag 2. Oktober 2008, 09:07
von sma
Wie wäre es mit dieser Syntax?
Der "Zufall" will es, dass dies valides Python ist, was du dann einfach mit `exec` einlesen und zu einem Dictionary machen kannst. Oder du benutzt `__import__()` oder `import`, um eine entsprechende Datei als Modul zu laden und dann das Modul wie ein Dictionay. Nutze doch einfach Python selbst für die Konfiguration.
Code: Alles auswählen
config = {}
exec read("config.py") in config
print config
Stefan
Verfasst: Donnerstag 2. Oktober 2008, 09:28
von mkesper
Hmm, das klingt für mich ziemlich gefährlich.
Verfasst: Donnerstag 2. Oktober 2008, 09:47
von arghargh
Das ist glaube ich alles zeilenbasiert, oder?
Die Doku ist nicht erreichbar:
http://python.org/doc/current/lib/modul ... arser.html
Zum regulären Ausdruck habe ich hier ein ähnliches Problem gefunden:
http://social.msdn.microsoft.com/Forums ... 9c53e65776
Es geht um "positive lookahead". Leider sagt mir das nicht soviel.
Verfasst: Donnerstag 2. Oktober 2008, 09:50
von arghargh
kann man module dynamisch importieren? das wäre natürlich eine einfache lösung. aber ich glaube ich möchte lieber reinen text.
Verfasst: Donnerstag 2. Oktober 2008, 10:07
von arghargh
Ha, ich habe den Code aus dem Link etwas umgebaut, so geht's:
Code: Alles auswählen
p = re.compile(r''' ^ # Beginning of the line
(?P<Key>[^=]*?) # Any text before the =, matched few as possible
(?:=) # Get the = now
(?P<Value>[^=\[]*) # Get everything that is not an =
(?=^[^=]*?=|\Z) # Look Ahead, Capture but don't consume
''', re.MULTILINE | re.DOTALL | re.VERBOSE)
Da sind allerdings noch ein paar überflüssige Klammern drin.
Verfasst: Donnerstag 2. Oktober 2008, 10:32
von Y0Gi
Was genau hast du vor? Wenn du Text auszeichnen und am Ende (mindestens) XHTML heraus bekommen möchtest, kann ich dir nur allerwärmstens das docutils-Paket und reST (reStructuredText) ans Herz legen. Die Syntax ist einfach zu schreiben und zu erweitern und in der Python-Community sehr verbreitet (wird u. a. für die neue Python-Dokumentation verwendet).
Verfasst: Donnerstag 2. Oktober 2008, 10:48
von arghargh
Hi,
mein Vorhaben:
http://www.python-forum.de/topic-16220.html
Momentan lese ich experimentell aus einer Textdatei, erzeuge HTML mit pyTextile und baue das mit Genshi in ein template.html ein.
Markup ist zwar gut, aber das meiste brauche ich davon gar nicht, dafür anderes. Ich möchte z.B. dass URLs automatisch zu Links werden.
Anderes lässt sich mit Textile gar nicht machen, da muss dann HTML von Hand rein.
Ein code-feature wie hier im Forum wär auch praktisch. Deswegen wär's cool wenn der Parser leicht zu erweitern wäre. Dazu habe ich ja auch schon einen heißen Tipp bekommen.
Eigentlich brauche ich die Genshi-Features auch gar nicht, es würde reichen die $xxxxx aus template.html zu ersetzen.
Verfasst: Donnerstag 2. Oktober 2008, 11:09
von Y0Gi
Auto-Links gibt es in Markdown: `<
http://www.example.com/>` und in reST etwas ähnliches. Komplett automatische Link-Hervorhebung nicht (die auch nicht immer unproblematisch ist), doch zumindest in Markdown wüsste ich, dass sich das recht leicht einbauen lässt. Nur wenn du (so nehme ich an) die Quellen selbst schreibst, kannst du da auch eben die paar Zeichen mehr rantippseln.
Für Code-Highlighting empfehle ich Pygments, das sich sowohl über Markdown (Pygments enthält dazu glaube ich noch ein Snippet von mir) als auch docutils/reST (Code auf der Pygments-Seite) einbinden lässt.
reST und Pygments benutze ich mittlerweile zufrieden auf einer Website für News mit Code darin.
Verfasst: Donnerstag 2. Oktober 2008, 11:20
von arghargh
Verfasst: Donnerstag 2. Oktober 2008, 11:33
von arghargh
ja, pygments habe ich auch schon ausprobiert, aber eben noch nicht eingebunden. Bei reST schreckt mich ein bisschen die Titel-Auszeichnung mit == ab, vielleicht gibt es da ja auch eine Alternative.
rest2web parst ebenfalls eine textdatei namens
http://www.voidspace.org.uk/python/rest ... index.html
Mhh. Die Qual der Wahl.
Verfasst: Donnerstag 2. Oktober 2008, 12:26
von arghargh
So was Doofes, HTML lässt sich auch nicht wirklich einbauen, denn spätestens bei etwas wie
ist schluss!
Vielleicht sollte ich getrennte Dateien verwenden, aber das wollte ich eigentlich vermeiden. Oder die Datei erst an einem Kennzeichen zweiteilen, und nur den ersten Teil in key/value zerlegen. Mhh.
Verfasst: Donnerstag 2. Oktober 2008, 14:54
von Zap
Wie wichtig ist es dir denn das du den HTML-Content innerhalb der XML-Datei im Klartext lesen kannst?
Weil wenn dich das nicht interessiert, würde ich den Vorschlag machen
den gesamtenen HTML-Stream mit Base46 zu kodieren und dann in deiner XML-Struktur abzuspeichern.
Wenn du den HTML-Content dann wiederhaben möchtest musst du ihn einfach nur wieder decodieren.
Eigentlich ganz easy und imho sichere Vorgehensweise:
Code: Alles auswählen
In [36]: html = u"""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
....: <html>
....: <head>
....: <meta http-equiv="content-type" content="text/html; charset=UTF-8">
....: <title>Bla</title>
....: </head>
....: <body>
....: <h1>Hello Wörld</h1>
....: </body>
....: </html>"""
In [37]: from xml.etree import ElementTree as ET
In [38]: import base64
In [39]: node = ET.Element("HTML")
In [41]: node.set("html", base64.encodestring(html.encode("utf-8")))
In [43]: xml = ET.tostring(node)
In [44]: root = ET.XML(xml)
In [45]: print unicode(base64.decodestring(root.get("html")), "utf-8")
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Bla</title>
</head>
<body>
<h1>Hello Wörld</h1>
</body>
</html>
Edit: Man kann zum Speicher sparen natrülich auch noch zlib extra dazu nehmen...

Verfasst: Freitag 3. Oktober 2008, 13:53
von arghargh
Danke für den Vorschlag! Ich möchte ich den Inhalt (Markup/HTML) allerdings von Hand schreiben, das Codieren ist da etwas unpraktisch. :-)
Re: Strategie zum Einlesen eines flat-files / regexp
Verfasst: Sonntag 5. Oktober 2008, 16:17
von Y0Gi
arghargh hat geschrieben:Nachdem ich gemerkt habe, dass es ungünstig ist, Markup/HTML in XML zu speichern [...]
Darf ich da nochmal nachhaken: Wie kommst du zu dieser Annahme? Wenn du XHTML meinst, kannst du es wunderbar innerhalb von XML unterbringen. Für die Eingabe von Hand dürfte es einfacher sein, dem XML-Gerüst um deinen User-Markup einen explizit vorangestellen Namespace zu geben und XHTML als Default zu verwenden.
Bestehende XML-Parser musst du nicht neu erfinden, über die Baumstruktur und z. B. XPath lässt sich ordentlich navigieren und Pygments kannst du immer noch nachträglich über CDATA-Blöcke jagen.
Verfasst: Sonntag 5. Oktober 2008, 16:37
von arghargh
Das war nur eine Annahme, ich habe keine Ahnung von XML. Ich bin nur über XHTML Tags im XML gestolpert. Aber dass es möglich sein müsste, XHTML in XML einzubauen leuchtet ein. Vielleicht versuche ich das später nochmal.