关于python:为什么”?’。isnumeric()`false?

Why is `'?'.isnumeric()` false?

根据官方的Unicode联合体代码表,所有这些都是数字:

1
2
3
4
?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?
Ⅰ   Ⅱ   Ⅲ   Ⅳ   Ⅴ   Ⅵ   Ⅶ   Ⅷ   Ⅸ   Ⅹ   Ⅺ   Ⅻ   ?   ?   ?   ?
ⅰ   ⅱ   ⅲ   ⅳ   ⅴ   ⅵ   ⅶ   ⅷ   ⅸ   ⅹ   ?   ?   ?   ?   ?   ?
?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?

但是,当我让python告诉我哪些是数字时,它们都是(甚至是?),除了四个:

1
2
In [252]: print([k for k in"????????????????ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ????ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ??????????????????" if not k.isnumeric()])
['?', '?', '?', '?']

那些是:

  • ?罗马数字横翻一百
  • ?拉丁文小写字母横翻C
  • ?倒数第二位
  • ?倒转数字三

为什么python认为这些不是数字?


为"具有单一代码数值属性的所有特征"文件。

The canonical reference for that property is the unicode character database.The information we need can be dug out of http://www.unicode.org/public/9.0.0/ucd/unicodedata.txt,which is the latest version at time of writing(late 2016)(warning:1.5mb text file).这是一个小小的作弊(文献资料载于UAX 3544)。我要把它的入口展示给一个字符,它是第一个,U+3023杭州数字三(E=12323;)

1
3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;;

第八个半导体分离场是"数值"属性;在此情况下,数值为3,由字符名称组成。"Python"是真的,如果这片土地不是真的。可直接使用unicodedata.numeric询问。

第三个半导体分离场是一个两个特征代码,给出"一般类别";在此情况下,"NL"。最重要但并非所有的,以数值表示的字符串在一个类别中(类别代码的第一封信是N)。The exceptions are all Hanzi that,depending on context,may or may not signify a number;see UAX 355;38.

现在,你的性格在问:

ZZU1

这些字符不具有指定的数值,所以Python的行为是正确的——作为文件。

注:per https://docs.python.org/3.6/whatsnew/3.6.html,python will only be updated to UNICODE 9.0.0 in the 3.6 release;however,afaict these characters have not changed in quite some time.

("为什么这些字符没有数值?"这是一个问题,只有统一代码财团才能明确答案;如果你感兴趣,我建议把它放到他们的邮件列表上。)