I'm doing a filter wherein I check if a unicode (utf-8 encoding) string contains no uppercase characters (in all languages). It's fine with me if the string doesn't contain any cased character at all.
For example: 'Hello!' will not pass the filter, but "!" should pass the filter, since "!" is not a cased character.
I planned to use the islower() method, but in the example above, "!".islower() will return False.
According to the Python Docs, "The python unicode method islower() returns True if the unicode string's cased characters are all lowercase and the string contained at least one cased character, otherwise, it returns False."
Since the method also returns False when the string doesn't contain any cased character, ie. "!", I want to do check if the string contains any cased character at all.
Something like this....
string = unicode("!@#$%^", 'utf-8')
#check first if it contains cased characters
if not contains_cased(string):
return True
return string.islower():
Any suggestions for a contains_cased() function?
Or probably a different implementation approach?
Thanks!
Здесь - полная информация о категориях символов Unicode.
Категории букв включают:
Ll -- lowercase
Lu -- uppercase
Lt -- titlecase
Lm -- modifier
Lo -- other
Обратите внимание, что Ll <-> islower ()
; аналогично для Lu
; (Lu или Lt) <-> istitle ()
Возможно, вы захотите прочитать сложное обсуждение корпуса, которое включает в себя обсуждение букв Lm
.
Слепое обращение со всеми «буквами» как с заглавными буквами явно неверно. Категория Lo
включает 45301 кодовую точку в BMP (подсчитано с использованием Python 2.6). Большая часть из них будет состоять из слогов хангыля, иероглифов CJK и других восточноазиатских символов - очень трудно понять, как их можно считать «заключенными в регистр».
Вы можете рассмотреть альтернативное определение, основанное на (неуказанном) поведении "заключенных в регистр символов", которое вы ожидаете. Вот простая первая попытка:
>>> cased = lambda c: c.upper() != c or c.lower() != c
>>> sum(cased(unichr(i)) for i in xrange(65536))
1970
>>>
Интересно, что существует 1216 x L1 и 937 x Lu, всего 2153 ... возможности для дальнейшего исследования того, что на самом деле означают L1 и Lu.
import unicodedata as ud
def contains_cased(u):
return any(ud.category(c)[0] == 'L' for c in u)
использовать модуль unicodedata
,
unicodedata.category(character)
возвращает « Ll
» для строчных букв и « Lu
» для прописных.
здесь вы можете найти список категорий символов Юникода