Python: как проверить, содержит ли строка в юникоде одинарный символ?
Я делаю фильтр, в котором я проверяю, содержит ли строка кодировки unicode (utf-8) никаких символов в верхнем регистре (на всех языках). Все в порядке со мной, если строка вообще не содержит какого-либо символа.
Например: «Привет!» не пройдет фильтр, но «!» должен пройти фильтр, так как «!» это не очерченный характер.
- Неподдерживаемые символы ввода
- Запросы URLDecoding
- Отображение символов юникода с использованием python
- Как найти коды Unicode, для которых шрифт имеет глифы, в системе на базе Debian?
- Python Unicode object и C API (получение char * из объектов pyunicode)
Я планировал использовать метод 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
» для прописных букв.
здесь вы можете найти список категорий символов Юникода