【问题标题】:Python: How to check if a unicode string contains a cased character?Python:如何检查 unicode 字符串是否包含大小写字符?
【发布时间】:2011-03-31 07:48:27
【问题描述】:

我正在做一个过滤器,在其中检查 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() 函数有什么建议吗?

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

谢谢!

【问题讨论】:

  • 您接受的答案似乎不正确。看我的回答。

标签: python unicode uppercase lowercase


【解决方案1】:

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 计算)。其中很大一部分是韩文音节、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 的真正含义的空间。

【讨论】:

  • @John:哇。谢谢你的解释。我花了一段时间才明白。我看了你的链接,我想我必须更广泛地研究它。我有一种感觉,我要找到的东西会让我彻底检查我的很多代码。哎呀。谢谢!
  • @Albert:不要惊慌。正如我所暗示的,首先要定义“装箱”的含义。与未封装的字符相比,您将对带外壳的字符应用什么不同的处理?我的示例定义是“具有大写或小写‘伙伴’的字符”。 1970 字符和 2153 之间的一些(可能全部)差异似乎是由于被归类为 Ll 的字符,因为它们看起来像一个小写字符,但没有 Lu 伙伴,反之亦然- 您需要确定这些是否为您的目的而“装箱”。顺便说一句,您可以更改您接受的答案:-)
  • @John:嗯,我实际上正在为我的 Web 服务制作一个 API。我的网络服务接受映射到我的数据库中特定记录的键。密钥区分大小写,密钥可以由任何 unicode 字符组成。因此,为了规范所有输入,我会将所有键查询转换为小写(如果它们具有大写等效项)。结果是当我创建记录键(我的用户可以自定义)时,我不能接受任何可以通过 toLower() 函数转换为等效小写字母的大写字符。所以我试图为此做一个过滤器。有什么建议吗?
  • @Albert:如果您的密钥区分大小写,您为什么要对其进行规范化? “用户可以自定义的记录键”是什么意思??? “任何 unicode 字符”与“不能接受任何大写字符”???从字面上回答你的问题:看起来你在c.lower() != c时不能接受字符c,这意味着如果key.lower() != key,你不能接受任何键。我认为你应该开始一个新的问题,用例子准确地解释你想要做什么。 BTW1:别忘了先接受这个问题的答案。 BTW2:Python 没有toLower 函数...
  • @John:我的错。我的意思是 lower() 函数。好的,我将开始一个新的问题。谢谢!
【解决方案2】:
import unicodedata as ud

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

【讨论】:

  • Arg alex,有什么你不知道的吗?
  • +1 : 可行的解决方案(与 John Machin 没有可执行代码的很好的解释相比)
【解决方案3】:

使用模块unicodedata

unicodedata.category(character)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2016-11-11
    • 1970-01-01
    相关资源
    最近更新 更多