Python: как проверить, содержит ли строка в юникоде одинарный символ?

Я делаю фильтр, в котором я проверяю, содержит ли строка кодировки unicode (utf-8) никаких символов в верхнем регистре (на всех языках). Все в порядке со мной, если строка вообще не содержит какого-либо символа.

Например: «Привет!» не пройдет фильтр, но «!» должен пройти фильтр, так как «!» это не очерченный характер.

Я планировал использовать метод islower (), но в приведенном выше примере «!». Islower () вернет False.

В соответствии с документами Python «Метод юникода python islower () возвращает значение True, если обведенные символы строки в кодировке Юникода имеют строчный регистр, а строка содержит по крайней мере один одинарный символ, в противном случае он возвращает False».

Так как метод также возвращает False, когда строка не содержит какого-либо обведенного символа, т. Е. «!», Я хочу проверить, содержит ли строка какой-либо одинарный символ.

Что-то вроде этого….

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

Любые предложения для функции contains_cased ()?

Или, возможно, другой подход к внедрению?

Благодаря!

3 Solutions collect form web for “Python: как проверить, содержит ли строка в юникоде одинарный символ?”

Вот полный совок по категориям символов Юникода.

Категории букв включают:

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

Заметим, что Ll <-> islower() ; аналогично для Lu ; (Lu or Lt) <-> istitle()

Вы можете прочитать сложную дискуссию об корпусе, в которую входит обсуждение Lm букв.

Слепо, что все «буквы», как обсаженные, явно ошибочны. Категория Lo включает 45301 кодовых точек в BMP (подсчитывается с использованием Python 2.6). Большой кусок из них будет Hangul Syllables, CJK Ideographs и других восточноазиатских персонажей – очень трудно понять, как их можно считать «обсаженными».

Возможно, вам захочется рассмотреть альтернативное определение, основанное на (неуказанном) поведении «обведенных символов», которое вы ожидаете. Вот простая первая попытка:

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

Интересно, что есть 1216 x Ll и 937 x Lu, в общей сложности 2153 … для дальнейшего изучения того, что Ll и 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 » для прописных букв.

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

  • BeautifulSoup4 stripped_strings дает мне байтовые объекты?
  • Как преобразовать строку в utf-8 в Python
  • Как обрабатывать строки юникода Python с нулевым байтом «правильный»?
  • В чем разница между префиксом u и префиксом unicode () в python?
  • Текст с веб-сайта отображается как тарабарщина вместо иврита
  • UnicodeDecodeError Загрузка с помощью sqlalchemy
  • Чтение элементов юникода в массив numpy
  • Unescaping Characters в строке с Python
  • Python - лучший язык программирования в мире.