Python: Wie überprüfe ich, ob ein Unicode-String ein verpacktes Zeichen enthält?

Ich mache einen Filter, in dem ich prüfe, ob eine Unicode (utf-8 encoding) String keine Großbuchstaben enthält (in allen Sprachen). Es ist gut mit mir, wenn die Saite überhaupt keinen verhüllten Charakter enthält.

Zum Beispiel: 'Hallo!' Wird nicht den Filter passieren, aber "!" Sollte den Filter passieren, da "!" Ist kein umhüllter Charakter.

Ich habe geplant, die islower () – Methode zu verwenden, aber im obigen Beispiel "!" Islower () wird False zurückgeben.

Nach dem Python Docs, "Die Python-Unicode-Methode islower () gibt True zurück, wenn die Unicode-String-Cased-Zeichen alle Kleinbuchstaben sind und die Zeichenfolge mindestens ein Gehäuse enthält, andernfalls gibt es False zurück."

Da die Methode auch False zurückgibt, wenn die Zeichenfolge kein gehülltes Zeichen enthält, dh. "!", Ich möchte überprüfen, ob die Saite überhaupt ein umhülltes Zeichen enthält.

Etwas wie das….

string = unicode("!@#$%^", 'utf-8') #check first if it contains cased characters if not contains_cased(string): return True return string.islower(): 

Irgendwelche Vorschläge für eine contains_cased () – Funktion?

Oder wahrscheinlich ein anderer Implementierungsansatz?

Vielen Dank!

3 Solutions collect form web for “Python: Wie überprüfe ich, ob ein Unicode-String ein verpacktes Zeichen enthält?”

Hier ist die volle Schaufel auf Unicode-Charakterkategorien.

Zu den Briefkategorien gehören:

 Ll -- lowercase Lu -- uppercase Lt -- titlecase Lm -- modifier Lo -- other 

Beachten Sie, dass Ll <-> islower() ; Ähnlich für Lu ; (Lu or Lt) <-> istitle()

Vielleicht möchten Sie die komplizierte Diskussion über Gehäuse lesen, die einige Diskussion über Lm Buchstaben enthält.

Blindes Behandeln aller "Briefe" wie gehüllt ist nachweislich falsch. Die Lo Kategorie enthält 45301 Codepunkte im BMP (gezählt mit Python 2.6). Ein großer Teil davon wäre Hangul Silben, CJK Ideographs und andere ostasiatische Charaktere – sehr schwer zu verstehen, wie sie als "cased" betrachtet werden könnten.

Vielleicht möchten Sie eine alternative Definition betrachten, die auf dem (nicht spezifizierten) Verhalten von "gedeckten Zeichen" basiert, die Sie erwarten. Hier ist ein einfacher erster Versuch:

 >>> cased = lambda c: c.upper() != c or c.lower() != c >>> sum(cased(unichr(i)) for i in xrange(65536)) 1970 >>> 

Interessanterweise gibt es 1216 x Ll und 937 x Lu, insgesamt 2153 … Umfang für weitere Untersuchungen dessen, was Ll und Lu wirklich bedeuten.

 import unicodedata as ud def contains_cased(u): return any(ud.category(c)[0] == 'L' for c in u) 

Verwenden Modul unicodedata ,

 unicodedata.category(character) 

Gibt " Ll " für Kleinbuchstaben und " Lu " für Großbuchstaben zurück.

Hier finden Sie eine Liste der Unicode-Charakterkategorien

  • Python: Unicode-Quelldatei fügt Leerzeichen (eigentlich Nullbytes) zwischen Zeichen hinzu
  • Wie kann man eine urlencodierte Unicode-String in Python aufheben?
  • Transformieren Sie Unicode-String in Python
  • Wie können Sie Python 2.x warnen, wenn Sie Strings zu Unicode zwingen?
  • Warum druckt ein Unicode obj in ipython kein Fehler?
  • Umfassendes Zeichenersatzmodul in Python für Nicht-Unicode und Nicht-Ascii für HTML
  • Kugelsichere Arbeit mit Kodierung in Python
  • 'Ascii' Codec kann nicht Zeichen an Position * ord nicht im Bereich (128)
  • Json.dump - UnicodeDecodeError: 'utf8' codec kann das Byte 0xbf nicht in Position 0 decodieren: ungültiges Startbyte
  • UnicodeEncodeError: 'ascii' Codec kann nicht Zeichen [...]
  • Python decodieren "\ u041b" string [duplizieren]
  • Python ist die beste Programmiersprache der Welt.