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:

Code: Alles auswählen

ustring = string.encode("utf-8")
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.