Python:如何检查unicode字符串是否包含一个cased字符?

时间:2010-08-18 02:18:07

标签: python unicode uppercase lowercase

我正在做一个过滤器,其中我检查unicode(utf-8编码)字符串是否包含没有大写字符(在所有语言中)。如果字符串根本不包含任何套接字符,那对我来说没问题。

例如:'你好!'不会通过过滤器,但“!”应该通过过滤器,因为“!”不是一个套装的角色。

我打算使用islower()方法,但在上面的示例中,“!”。islower()将返回False。

根据Python Docs,“如果unicode字符串的套接字符全部为小写且字符串包含至少一个套接字符,则python unicode方法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 个答案:

答案 0 :(得分:8)

import unicodedata as ud

def contains_cased(u):
  return any(ud.category(c)[0] == 'L' for c in u)

答案 1 :(得分:6)

Here是关于Unicode字符类别的完整独家新闻。

信件类别包括:

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

请注意Ll <-> islower();同样适用于Lu; (Lu or Lt) <-> istitle()

您可能希望阅读关于套管的复杂讨论,其中包括对Lm字母的一些讨论。

盲目地将所有“字母”视为套管是明显错误的。 Lo类别包括BMP中的45301个代码点(使用Python 2.6计算)。其中很大一部分是Hangul Syllables,CJK表意文字和其他东亚角色 - 很难理解它们如何被视为“套装”。

您可能希望根据您期望的“套装字符”的(未指定的)行为来考虑替代定义。这是一个简单的第一次尝试:

>>> 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的真正含义。

答案 2 :(得分:1)

使用模块unicodedata

unicodedata.category(character)

返回“Ll”表示小写字母,“Lu”表示大写字母。

here您可以找到unicode字符类别列表