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.
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

utf-8 und regular expression fragen

Beitragvon mitsuhiko » Mittwoch 26. Januar 2005, 17:55

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
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 26. Januar 2005, 19:23

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: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon Gast » Mittwoch 26. Januar 2005, 20:31

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
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Mittwoch 26. Januar 2005, 21:47

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
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 26. Januar 2005, 23:34

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: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Donnerstag 27. Januar 2005, 13:59

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 27. Januar 2005, 14:18

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

Beitragvon mitsuhiko » Donnerstag 27. Januar 2005, 15:19

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 27. Januar 2005, 15:23

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder