8

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

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

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

根据 Python Docs,“python unicode 方法 islower() 如果 unicode 字符串的大小写字符全部为小写且字符串包含至少一个大小写字符,则返回 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() 函数有什么建议吗?

或者可能是不同的实现方法?

谢谢!

4

3 回答 3

8
import unicodedata as ud

def contains_cased(u):
  return any(ud.category(c)[0] == 'L' for c in u)
于 2010-08-18T02:25:05.453 回答
8

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

于 2010-08-18T08:08:26.997 回答
1

使用模块unicodedata

unicodedata.category(character)

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

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

于 2010-08-18T02:27:46.367 回答