Seite 1 von 1
Encodings ? Locales ?
Verfasst: Freitag 26. Januar 2007, 09:27
von DARDAN
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ß
Verfasst: Freitag 26. Januar 2007, 09:37
von sape
Hi und willkommen im Forum.
Versuch mal die ``str``-Methode ``translate``
http://docs.python.org/lib/string-methods.html#l2h-268
lg
Verfasst: Freitag 26. Januar 2007, 09:38
von lhorn
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.
Verfasst: Freitag 26. Januar 2007, 09:50
von sape
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:
lg
Verfasst: Freitag 26. Januar 2007, 09:57
von lhorn
Gute Idee! An translate hat mich immer gestört, dass man ja die komplette Übersetzungstabelle angeben muss. Aber so geht es natürlich.
Verfasst: Freitag 26. Januar 2007, 10:01
von 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.
Verfasst: Freitag 26. Januar 2007, 10:14
von sape
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:
lg
Verfasst: Freitag 26. Januar 2007, 11:59
von Luzandro
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)
Verfasst: Freitag 26. Januar 2007, 20:12
von 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.
Verfasst: Sonntag 28. Januar 2007, 04:00
von DARDAN
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,"]
Verfasst: Sonntag 28. Januar 2007, 08:01
von cracki
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)
Verfasst: Sonntag 28. Januar 2007, 09:10
von 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?
Verfasst: Sonntag 28. Januar 2007, 10:07
von birkenfeld
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`.
Verfasst: Dienstag 30. Januar 2007, 08:30
von cracki
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
