Seite 1 von 1
Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 11:30
von Vinz
Hallo zusammen,
ich würde gerne aus dem folgenden Beispiel nur Wörter Filter, am Liebsten mittels "re — Regular expression operations".
Beispiel:
"$50.000_Zhuhai_2016
0 Banja_Luka_Challenger_2017
Vorlage:Taxobox/Doku
!Amerika!"
würde gerne so etwas wie das folgende bekommen:
"Zhuhai"
"Banja"
"Luka"
"Challenger"
"Vorlage"
"Taxobox"
"Doku"
"Amerika"
Vielen Dank vorab
Freundliche Grüße
Vinz
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 11:40
von Sirius3
Schön dass Du das willst. Aber was ist die Frage? Was hast Du schon versucht? Wo kommst Du nicht weiter?
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 11:48
von __blackjack__
@Vinz: Das `re`-Modul in der Standardbibliothek ist selbstverständlich dokumentiert. Es gibt in der Dokumentation auch noch ein extra HOWTO zu dem Thema, was dort auch verlinkt ist.
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 11:53
von snafu
@Vinz: Schau dir reguläre Ausdrücke an und dort speziell Character Sets. Die Standardbibliothek bietet mit dem re-Modul eine Schnittstelle dafür. Das ist bloß ein Einzeiler, wenn man die passende Funktion verwendet.
Komplettlösungen bieten wir hier übrigens selten, falls du dir das mit deinem Thread erhofft hast. Vor allem, wenn es recht offensichtlich nach einer Hausaufgabe aussieht.
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 13:19
von pixewakb
Hilft das Dir etwas weiter?
https://stackoverflow.com/questions/375 ... n-a-string
Online kannst Du gute Hilfen zum Zusammenbau von regulären Ausdrücken finden.
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 13:23
von ThomasL
und hier
https://regexr.com/ kann man sehr gut mit regular expressions rumspielen
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 13:32
von snafu
In der Definition von
\w sind allerdings auch Ziffern enthalten. Wenn man ein Wort als reine Buchstabenfolge ansieht (was ja durchaus gängig und hier gewünscht ist), dann muss man sein eigenes Set festlegen.
Also entweder
[a-zA-Z] oder
[a-z] in Verbindung mit dem Flag
re.IGNORECASE. Und dahinter noch das Zeichen für "mindestens einmal".
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 15:57
von __blackjack__
@snafu: Wobei hier dann interessant ist ob und welche Zeichen ausserhalb von ASCII dabei (nicht) erfasst werden. Falls das eine Rolle spielt.
Man könnte das `regex`-Modul nehmen und da dann [\p{Letter}] als Zeichenklasse.
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 16:09
von snafu
Das lässt sich natürlich endlos weiterspinnen, aber wenn ich nur englische und deutsche Wörter erwarte und dementsprechend auch Umlaute behandeln muss, dann sollte folgendes ausreichen:
Außerdem möchte man sich vielleicht überlegen, ob Wörter mit Bindestrichen als ein durchgängiges Wort oder als einzelne Wörter zählen sollen. Falls Bindestriche auch als Trennzeichen vorkommen können, wird es noch einmal spannender: Bleibt der Bindestrich erhalten oder soll er im Ergebnis entfernt werden? Für letzteres könnte man ein automatisches Entfernen einbauen, falls ein Zeilentrenner (\n) folgt. Das ist hier aber vermutlich etwas zuviel des Guten...
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 16:28
von __blackjack__
@snafu: Das erwischt so einiges was kein Buchstabe ist. Kleine Auswahl:
Code: Alles auswählen
In [151]: re.findall(r'[a-ü]+', '{funktioniert} ¬ hoch² ±2¢', re.IGNORECASE)
Out[151]: ['{funktioniert}', '¬', 'hoch²', '±', '¢']
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 16:46
von snafu
Ich glaube aber nicht, dass das definiertes Verhalten für Character Ranges außerhalb von ASCII ist, oder? Da sollte man vielleicht mal Pythons Umgang mit regulären Ausdrücken verbesssern...
Re: Wörter erkennen.
Verfasst: Montag 31. Dezember 2018, 18:00
von __blackjack__
@snafu: Ich verstehe nicht worauf Du hinaus willst? ``a-ü`` ist IMHO definiert als alle Zeichen mit den Zahlwerten von ``ord('a')`` bis einschliesslich ``ord('ü')``, also die Unicode-Codepoints. Das ist wohldefiniert. In Python 2 bei Bytezeichenketten hängt das natürlich von der Kodierung des Quelltextes ab, aber auch da ist das dann entsprechend definiert. Was gibt es da zu verbessern? Also ausser das man das `regex`-Modul nehmen kann, was dann so etwas wie ``\p{Letter}`` in Zeichenklassen innerhalb von regulären Ausdrücken kennt, das auf alles passt, was in der Unicode-Spezifikation als Buchstabe definiert ist. Man könnte das beim `regex`-Modul über diese Eigenschaften auch noch weiter eingrenzen. Zum Beispiel auf Buchstaben (logisches) und Codepoints aus dem (erweiterten) lateinische Zeichen-Block. Damit hätte man dann Buchstaben, aber zum Beispiel keine klingonischen Buchstaben.

Re: Wörter erkennen.
Verfasst: Dienstag 1. Januar 2019, 01:17
von Sirius3
Mit etwas Mengenleere kommt man auf '[^\W\d_]+', also alles was nicht kein Buchstabe, Zahl oder Unterstrich ist, nicht eine Zahl und nicht ein Unterstrich, mit anderen Worten ein Buchstabe.