Encodings ? Locales ?

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
DARDAN
User
Beiträge: 2
Registriert: Freitag 26. Januar 2007, 08:13

Hallo,

Aus einem Text soll alles wie (.,?!""#'``<> etc) entfernt werden, so dass nur das (die) Wort(er) bleiben sollen, die in eine Liste ausgegeben werden sollen. Wörter die Sonderzeichen haben ('ë','Ë','ç','Ç', etc) sollen auch wie ein Wort behandelt werden.
Ich habe ein Code aber der ist mir zu lang. Man kann bestimmt mit RE (regulären Ausdruck) lösen, aber wie? :?

Danke für Diskussion, Antwort, Lösung, etc..

Gruß
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi und willkommen im Forum.

Versuch mal die ``str``-Methode ``translate``
http://docs.python.org/lib/string-methods.html#l2h-268


lg
lhorn
User
Beiträge: 8
Registriert: Freitag 25. Februar 2005, 09:45

Schau mal hier:

http://docs.python.org/lib/re-syntax.html

Insbesondere heißt es zu '\w'
When the LOCALE and UNICODE flags are not specified, matches any alphanumeric character and the underscore; this is equivalent to the set [a-zA-Z0-9_]. With LOCALE, it will match the set [0-9_] plus whatever characters are defined as alphanumeric for the current locale. If UNICODE is set, this will match the characters [0-9_] plus whatever is classified as alphanumeric in the Unicode character properties database.
Zusammen mit '\b' zur Erkennung von Wortgrenzen solltest Du einen regulären Ausdruck hinbegkommen, der das Gewünschte leistet.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

So geht das mit ``translate``.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 

import string

table = "".join([chr(x) for x in xrange(256)])
deletechars = string.punctuation + string.digits

print "foo!)(/% bar".translate(table, deletechars)
outpout:

Code: Alles auswählen

foo bar
lg
lhorn
User
Beiträge: 8
Registriert: Freitag 25. Februar 2005, 09:45

Gute Idee! An translate hat mich immer gestört, dass man ja die komplette Übersetzungstabelle angeben muss. Aber so geht es natürlich.
BlackJack

Es wäre aber vielleicht geschickter die Zeichen nicht zu löschen, sondern durch Leerzeichen zu ersetzen. Sonst kreiert man neue Worte, wenn zwei Worte nur durch eines oder mehrere der unerwünschten Zeichen getrennt ist.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Stimmt. Ausserdem fällt mir auf, das er ja Unicode haben will und ``translate`` akzeptiert leider keinen ``deletechars`` Parameter :?

Hier der neue Code, der auch mit Unicode Funktioniert.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8

import sys, codecs, string
stdout_encoding = sys.stdout.encoding or sys.getfilesystemencoding()

deletechars = string.punctuation + string.digits
tmp = u"föo!)(/%bär"
for char in deletechars:
    tmp = tmp.replace(char, ' ')

print tmp.encode(stdout_encoding)
output:

Code: Alles auswählen

föo     bär
lg
Benutzeravatar
Luzandro
User
Beiträge: 87
Registriert: Freitag 21. April 2006, 17:03

lhorn hat geschrieben:An translate hat mich immer gestört, dass man ja die komplette Übersetzungstabelle angeben muss.
Dafür gibt es string.maketrans

Code: Alles auswählen

table = string.maketrans(deletechars, " "*len(deletechars))
print "foo!)(/% bar".translate(table)
Bei unicode könnte man es theoretisch ähnlich machen, wenn es öfter benötigt wird

Code: Alles auswählen

table = dict( [ (ord(char), u" ") for char in deletechars ] )
print u"föö!)(/% bär".translate(table)
[url=http://www.leckse.net/artikel/meta/profilieren]Profilieren im Netz leicht gemacht[/url]
BlackJack

Bei Unicode sind die "nicht-Wort-Zeichen" aber vielleicht ein wenig umfangreicher, als dass man sie explizit in eine Tabelle schreiben könnte. Da zählen dann ja auch Bulletzeichen (•), Auslassungspunkte (…), Gedankenstriche (─), mathematische Operatoren (×, ÷) und weiss der Geier was noch alles, zu den unerwünschten Zeichen.

Da könnte man vielleicht mit `unicodedata.category()` arbeiten, um die Zeichen zu testen.
DARDAN
User
Beiträge: 2
Registriert: Freitag 26. Januar 2007, 08:13

Mit Wort meine ich mit Buchstaben-Zeichen, die im Alphabet einer Sprache sind. Geschriebene Wörter wie: "Buchstaben-Zeichen" oder Python-Forum (aber auch das Wort, das Punkt oder Komma im String enthält) sollten dann so aussehen: "BuchstabenZeichen" oder "PythonForum".

Als Beispiel: aus dem Text oben soll eine Liste mit string-Elementen (aus Wörtern) entstehen.

["Mit", "Wort", "meine", "ich", "mit", "BuchstabenZeichen", "die", "im", "Alphabet", "einer", "Sprache", "sind", "Geschriebene", "Wörter", "wie", "BuchstabenZeichen", "oder", "PythonForum", "aber", "auch", "das", "Wort", "das", "Punkt", "oder", "Komma", "im", "String", "enthält", "sollten", "dann", "so", "aussehen", "BuchstabenZeichen", "oder", "PythonForum,"]
cracki
User
Beiträge: 72
Registriert: Montag 25. Dezember 2006, 05:01

quelle = "fön eich-hörn-\nchen 42 v1a6ra !@#$$ %^&* @#$@"

stueckchen = re.split(r'(?i)[^a-z0-9öüä]+', quelle)

das fette gibt an, woraus ein wort bestehen kann.

wenn du bin-de-strich-woer-ter zusammen haben willst, mach folgendes:

quelle = re.sub(r"(?<=\w)-\s*", "", quelle)
...meh...
BlackJack

cracki hat geschrieben:quelle = "fön eich-hörn-\nchen 42 v1a6ra !@#$$ %^&* @#$@"

stueckchen = re.split(r'(?i)[^a-z0-9öüä]+', quelle)

das fette gibt an, woraus ein wort bestehen kann.
Dann hast Du bei “Buchstaben-Zeichen, die im Alphabet einer Sprache sind” die eine Sprache mit deutschsprachig übersetzt und das ``ß`` vergessen.

Hier mal ein anderer Beispieltext:
Das Wort TeX spricht man wie “Tech” aus, da es sich eigentlich um
griechische Buchstaben handelt und der letzte Buchstabe eigentlich ein “chi” ist.
In Zeiten von Unicode kann man Τεχ (Tau-epsilon-chi) auch "richtig" schreiben.
Ach und der Martijn fragt, was mit Ligaturen passieren soll. :-)
Was soll da als Ergebnis herauskommen?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

cracki hat geschrieben:quelle = "fön eich-hörn-\nchen 42 v1a6ra !@#$$ %^&* @#$@"

stueckchen = re.split(r'(?i)[^a-z0-9öüä]+', quelle)

das fette gibt an, woraus ein wort bestehen kann.
Dafür gibts "\W" und `re.UNICODE` bzw. `re.LOCALE`.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
cracki
User
Beiträge: 72
Registriert: Montag 25. Dezember 2006, 05:01

ich weiss auch nicht mehr was ich mir da gedacht habe...

zum glueck kann hier aber jeder auf die arbeit anderer aufbauen und sie verbessern. wenns nicht so waere, wuerde hier ja garnichts zustandekommen :)
...meh...
Antworten