Wörter erkennen.

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
Vinz
User
Beiträge: 3
Registriert: Freitag 10. August 2018, 08:50

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
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Schön dass Du das willst. Aber was ist die Frage? Was hast Du schon versucht? Wo kommst Du nicht weiter?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

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.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

und hier https://regexr.com/ kann man sehr gut mit regular expressions rumspielen
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

pixewakb hat geschrieben: Montag 31. Dezember 2018, 13:19 Hilft das Dir etwas weiter?

https://stackoverflow.com/questions/375 ... n-a-string
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".
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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:

Code: Alles auswählen

re.findall(r'[a-ü]+', text, re.IGNORECASE)
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...
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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²', '±', '¢']
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten