Python:如何检查unicode字符串中是否包含大小写字母?
我正在做一个过滤器,用来检查一个unicode(utf-8编码)字符串是否不包含任何大写字母(无论是什么语言)。如果这个字符串根本没有字母也没关系。
举个例子:'Hello!' 这个字符串会被过滤掉,因为它有大写字母,但 "!" 这个字符串就可以通过过滤,因为 "!" 不是字母。
我原本打算用 islower() 方法来检查,但在上面的例子中,"!".islower() 会返回 False。
根据Python的文档,"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 个回答
使用模块 unicodedata
,
unicodedata.category(character)
它会返回 "Ll
" 表示小写字母,"Lu
" 表示大写字母。
在这里你可以找到 Unicode 字符类别的列表。
import unicodedata as ud
def contains_cased(u):
return any(ud.category(c)[0] == 'L' for c in u)
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
这里有关于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计算)。其中有很大一部分是韩文音节、汉字和其他东亚字符——很难理解它们怎么会被认为是“有大小写”。
你可能想考虑一个替代定义,基于你期望的“有大小写字符”的(未指定)行为。这里有一个简单的初步尝试:
>>> cased = lambda c: c.upper() != c or c.lower() != c
>>> sum(cased(unichr(i)) for i in xrange(65536))
1970
>>>
有趣的是,Ll
有1216个,Lu
有937个,总共2153个……这为进一步研究Ll
和Lu
的真正含义提供了空间。