utf-8 und regular expression fragen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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
TUFKAB – the user formerly known as blackbird
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Gerson Kurz halt.
Lesenswert sind auch Lambdaizing Python Code und Obfuscated Python ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Leonidas hat geschrieben:Gerson Kurz halt.
Lesenswert sind auch Lambdaizing Python Code und Obfuscated Python ;)
Ist nicht java2k auch von ihm?
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

blackbird hat geschrieben:Ist nicht java2k auch von ihm?
Jep, und nicht nur das: es gibt noch einige mehr.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten