2017-06-27 1 views
7

Auf stackoverflow gibt es viele Antworten darüber, wie man nur alphabetische Zeichen aus einer Zeichenkette behält, am bekanntesten ist die berühmte Regex '[^a-zA-Z]'. Aber diese Antwort ist völlig falsch, weil sie annimmt, dass jeder nur Englisch schreibt ... Ich dachte, ich könnte alle diese Antworten abstimmen, aber ich dachte schließlich, es wäre konstruktiver, die Frage noch einmal zu stellen, weil ich die Antwort nicht finden kann.Behalten Sie nur alphabetische Zeichen (mehrsprachig) in einer Zeichenkette bei

Gibt es einen einfachen (oder nicht ...) Weg in Python, nur alphabetische Zeichen aus einer Zeichenfolge zu behalten, die für alle Sprachen funktioniert? Ich denke, vielleicht über eine Bibliothek, die wie xregexp in Javascript, ... Von allen Sprachen tun konnte ich mein Englisch, aber auch Französisch, Russisch, Chinesisch, greec ... etc

+3

ich denke, es einfacher sein kann, die ganze Unicode enthalten und nicht-alphabetische Zeichen ausschließen –

+0

@MoonCheesez ich genau die gleiche Art und Weise zu denken war. Es gibt einen einfachen Weg, dies im Shell-Scripting zu tun, aber ich kann mir im Moment keine pythonische Art vorstellen. –

Antwort

7

[^ \ W \ d_]

Mit Python3 oder dem re.UNICODE Flag in Python2 könnten Sie [^\W\d_] verwenden.

\ W: Wenn UNICODE gesetzt ist, wird dies nichts gefunden außer [0-9_] zuzüglich Zeichen als nicht alphanumerische im Unicode-Zeichen Eigenschaften Datenbank klassifiziert.

Also [^\W\d_] ist alles, was nicht alphanumerisch oder keine Ziffer oder kein Unterstrich ist. Mit anderen Worten, es ist ein alphabetisches Zeichen. :)

>>> import re 
>>> re.findall("[^\W\d_]", "jüste Ä tösté 1234 ßÜ א д", re.UNICODE) 
['j', 'ü', 's', 't', 'e', 'Ä', 't', 'ö', 's', 't', 'é', 'ß', 'Ü', 'א', 'д'] 

Remove Ziffern zuerst, dann suchen Sie nach "\ w"

diese gewundenen Logik zu vermeiden, könnten Sie auch Ziffern entfernen und unterstreicht zuerst, und dann für alphanumerische Zeichen:

>>> without_digit = re.sub("[\d_]", "", "jüste Ä tösté 1234 ßÜ א д", re.UNICODE) 
>>> re.findall("\w", without_digit, re.UNICODE) 
['j', 'ü', 's', 't', 'e', 'Ä', 't', 'ö', 's', 't', 'é', 'ß', 'Ü', 'א', 'д'] 

regex Modul

es scheint, dass regex Modul helfen könnte, da es \p{L} oderversteht 10.

Diese Regex-Implementierung ist abwärtskompatibel mit dem Standardmodul , bietet jedoch zusätzliche Funktionen.

>>> import regex as re 
>>> re.findall("\p{L}", "jüste Ä tösté 1234 ßÜ א д", re.UNICODE) 
['j', 'ü', 's', 't', 'e', 'Ä', 't', 'ö', 's', 't', 'é', 'ß', 'Ü', 'א', 'д'] 

(Getestet mit Anaconda Python 3.6)

+0

Ich habe versucht das 'Regex' Modul und '\ p {L}', es sieht aus wie es nur lateinische Buchstaben ohne Akzente hält ... Vielleicht habe ich irgendwo etwas verpasst, aber es sollte in Bezug auf eine der Dokumentation funktionieren Beispiel: '[\ p {L} - QW] # Set enthält alle Buchstaben außer 'Q' und 'W'' – Laurent

+1

es sieht aus wie Ihre erste und zweite Beispiel funktioniert perfekt :) – Laurent

+0

Ich benutze Version 2.7.9. Versucht mit Version 3, aber ich habe ein Problem versucht zu importieren "Regex" mit Pip installiert und da ich kein Python-Experte bin und nicht zu viel Zeit verbringen wollte versuchen, "Regex" zu importieren, habe ich 2.7.9 für Tests verwendet . – Laurent

Verwandte Themen