Seite 1 von 1
utf-8 und regular expression fragen
Verfasst: Mittwoch 26. Januar 2005, 17:55
von mitsuhiko
Hallo,
Ich möchte ein Kommentartool schreiben, damit man Seiten kommentieren kann.
Dazu soll die Datei als unicode abgespeichert werden. Kann es sein, dass das Umwandeln in utf-8 mit diesem Befehl geht:
2. Frage:
In php hätte ich so gemacht:
Code: Alles auswählen
preg_replace("/\[b\](.*)\[\/b\]/Uism", "<b>\\1</b>", $string);
Wie funktioniert das in Python?
Auf Antworten freut sich
blackbird
Verfasst: Mittwoch 26. Januar 2005, 19:23
von Dookie
Hi blackbird,
es kommt darauf an in welchem Encoding dein String vorliegt. Bei latin1 z.B. kannst Du mit
ustring = string.decode("latin-1") einen Unicodestring erzeugen. Diesen kannst du dann mit
encoded = ustring("utf-8") in einen String mit Unicodes umwandeln und diesen dann speichern oder,
am elegantesten ist wohl die Verwendung des Moduls codecs.
zu 2.:
Code: Alles auswählen
regex = re.compile(r"\[b\](.*?)\[/b\]", re.I | re.S | re.M)
html = regex.sub(r"<b>\1</b>", string)
Ungreedy-Flag gibt es bei Python keines, daher musst du beim Pattern das ? machen. Flags kannst du bei re.sub leider auch keine übergeben, daher erst mit re.compile ein Regularexpression Objekt erzeugen und dann mit regex.sub die Ersetzung machen.
Gruß
Dookie
Verfasst: Mittwoch 26. Januar 2005, 20:31
von Gast
Dookie hat geschrieben:Flags kannst du bei re.sub leider auch keine übergeben,
KLar geht das:
Code: Alles auswählen
html = re.sub(r"\[b\](.*?)\[/b\](?uism)",r"<b>\1</b>", string)
joe
Verfasst: Mittwoch 26. Januar 2005, 21:47
von mitsuhiko
Danke. Das mit dem replace funktioniert genau wie ich es wollte. Ein ? mehr macht ja auch nichts.
Aber das mit dem unicode hab ich nicht kapiert. Ich mache sowas:
Code: Alles auswählen
>>> test = "Hallo Wörld"
>>> test2 = test.decode("latin-1")
>>> test2
''Hallo W\xf6rld'
Ich dachte, bei Unicde steht ein u"foobar"?
Und vor allem, wie lade ich dass, für eine cgi Datei, damit ich es als utf-8 kodiert zum Browse senden?
Ich bin etwas verwirrt.
Verfasst: Mittwoch 26. Januar 2005, 23:34
von Dookie
Wie gesagt, es kommt darauf an, welches Encoding der String hat, bzw. mit welchem Zeichenencoding dein System arbeitet oder mit welchem Encoding du den Text geschrieben hast.
Code: Alles auswählen
>>> "Hallo W\xf6rld".decode("latin1")
Out[91]: u'Hallo W\xf6rld'
>>> "Hallo W\xf6rld".decode("latin1").encode("utf-8")
Out[92]: 'Hallo W\xc3\xb6rld'
hier nochmal ein Link zur Unicode-FAQ, da sind auch Tipps zu Python und wie man am besten mit Unicodedateien arbeitet dabei.
http://p-nand-q.com/python/unicode_faq.html
Dookie
Verfasst: Donnerstag 27. Januar 2005, 13:59
von mitsuhiko
Danke für die Antwort. Werde ich mir durchlesen.
Folgendes finde ich irgendwie lustig:
Näheres zu der haarigen Unicode-Unterstützung von Win32 gibt es in einem eigenen Kapitel, weiter unten. Um die folgenden Beispiele unter Windows durchführen, gibt es drei Möglichkeiten:
* Erstellen eines Beispieltextes in Notepad, ausführen mit Python.
* Trotz aller Nachteile die Win32 Console-Version von Python einsetzen.
* Linux installieren
Verfasst: Donnerstag 27. Januar 2005, 14:18
von Leonidas
Gerson Kurz halt.
Lesenswert sind auch Lambdaizing Python Code und Obfuscated Python

Verfasst: Donnerstag 27. Januar 2005, 15:19
von mitsuhiko
Leonidas hat geschrieben:Gerson Kurz halt.
Lesenswert sind auch Lambdaizing Python Code und Obfuscated Python

Ist nicht java2k auch von ihm?
Verfasst: Donnerstag 27. Januar 2005, 15:23
von Leonidas
blackbird hat geschrieben:Ist nicht java2k auch von ihm?
Jep, und nicht nur das:
es gibt noch einige mehr.