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

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

我在做一个过滤器,检查一个Unicode(UTF-8编码)字符串是否不包含大写字符(在所有语言中)。如果字符串根本不包含任何大小写字符,我也可以。

例如:"你好!"不会通过过滤器,但"!"应该通过过滤器,因为"!"不是大小写字符。

我计划使用islower()方法,但在上面的示例中,"!".islower()将返回false。

根据python文档,"如果unicode字符串的大小写字符都是小写并且字符串至少包含一个大小写字符,则python unicode方法islower()返回true,否则返回false。"

因为当字符串不包含任何大小写字符时,该方法也返回false,即"!",我想检查字符串是否包含任何大小写字符。

像这样的……

1
2
3
4
5
6
7
string = unicode("!@#$%^", 'utf-8')

#check first if it contains cased characters
if not contains_cased(string):
     return True

return string.islower():

有没有关于contains_cased()函数的建议?

或者可能是另一种实现方法?

谢谢!


1
2
3
4
import unicodedata as ud

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


以下是关于Unicode字符类别的完整独家报道。

信件类别包括:

1
2
3
4
5
Ll -- lowercase
Lu -- uppercase
Lt -- titlecase
Lm -- modifier
Lo -- other

注意:Ll <-> islower();与Lu相似;(Lu or Lt) <-> istitle()

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

盲目地将所有"字母"视为有壳字母显然是错误的。Lo类别包括BMP中的45301个代码点(使用python 2.6计算)。其中很大一部分是朝鲜文音节、CJK汉字和其他东亚字符——很难理解它们是如何被视为"大小写"的。

您可能需要考虑一个基于您所期望的"cased characters"的(未指定)行为的替代定义。下面是一个简单的第一次尝试:

1
2
3
4
>>> 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的真正含义的范围。


使用模块unicodedata

1
unicodedata.category(character)

对于小写字母返回"EDOCX1"〔1〕,对于大写字母返回"EDOCX1"〔2〕。

您可以在这里找到Unicode字符类别的列表