Python:如何检查unicode字符串中是否包含大小写字母?

8 投票
3 回答
5969 浏览
提问于 2025-04-16 02:57

我正在做一个过滤器,用来检查一个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 个回答

1

使用模块 unicodedata

unicodedata.category(character)

它会返回 "Ll" 表示小写字母,"Lu" 表示大写字母。

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

8
import unicodedata as ud

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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

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计算)。其中有很大一部分是韩文音节、汉字和其他东亚字符——很难理解它们怎么会被认为是“有大小写”。

你可能想考虑一个替代定义,基于你期望的“有大小写字符”的(未指定)行为。这里有一个简单的初步尝试:

>>> 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个……这为进一步研究LlLu的真正含义提供了空间。

撰写回答