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: Ersetzen Sie den unauslöschlichen Platz in Unicode
  • Python decodieren "\ u041b" string [duplizieren]
  • Python 3: Entmystifizieren von Codierungs- und Decodierungsmethoden
  • Arbeiten mit Unicode-Tasten in einem Python-Wörterbuch
  • Python: Split Unicode-String auf Wortgrenzen
  • Konvertieren Sie numerische Zeichenfolgen zu hochgestellt
  • In Python, extrahieren nicht-englischen Worten
  • Python zlib Ausgabe, wie man aus mysql utf-8 Tabelle wiederherstellen?
  • Skript, um Unicode-Zeichen in <U9999> Format in ihre ASCII-Äquivalente zu konvertieren
  • BeautifulSoup gibt mir nicht Unicode
  • Python check if utf-8 string ist Großbuchstaben
  • Python ist die beste Programmiersprache der Welt.