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ß
Encodings ? Locales ?
Hi und willkommen im Forum.
Versuch mal die ``str``-Methode ``translate``
http://docs.python.org/lib/string-methods.html#l2h-268
lg
Versuch mal die ``str``-Methode ``translate``
http://docs.python.org/lib/string-methods.html#l2h-268
lg
Schau mal hier:
http://docs.python.org/lib/re-syntax.html
Insbesondere heißt es zu '\w'
http://docs.python.org/lib/re-syntax.html
Insbesondere heißt es zu '\w'
Zusammen mit '\b' zur Erkennung von Wortgrenzen solltest Du einen regulären Ausdruck hinbegkommen, der das Gewünschte leistet.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.
So geht das mit ``translate``.
outpout:
lg
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)
Code: Alles auswählen
foo bar
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.
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.
output:
lg
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)
Code: Alles auswählen
föo bär
Dafür gibt es string.maketranslhorn hat geschrieben:An translate hat mich immer gestört, dass man ja die komplette Übersetzungstabelle angeben muss.
Code: Alles auswählen
table = string.maketrans(deletechars, " "*len(deletechars))
print "foo!)(/% bar".translate(table)
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]
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.
Da könnte man vielleicht mit `unicodedata.category()` arbeiten, um die Zeichen zu testen.
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,"]
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,"]
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)
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...
Dann hast Du bei “Buchstaben-Zeichen, die im Alphabet einer Sprache sind” die eine Sprache mit deutschsprachig übersetzt und das ``ß`` vergessen.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.
Hier mal ein anderer Beispieltext:
Was soll da als Ergebnis herauskommen?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.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Dafür gibts "\W" und `re.UNICODE` bzw. `re.LOCALE`.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.