Python: How to check if a unicode string contains a cased character?

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!

8
задан ErikE 10 September 2010 в 17:08
поделиться

3 ответа

Здесь - полная информация о категориях символов 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.

6
ответ дан 5 December 2019 в 11:21
поделиться
import unicodedata as ud

def contains_cased(u):
  return any(ud.category(c)[0] == 'L' for c in u)
8
ответ дан 5 December 2019 в 11:21
поделиться

использовать модуль unicodedata ,

unicodedata.category(character)

возвращает « Ll » для строчных букв и « Lu » для прописных.

здесь вы можете найти список категорий символов Юникода

1
ответ дан 5 December 2019 в 11:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: