python isdigit()函数对非数字字符u'\ u2466'返回true

lxy*_*xyu 9 python unicode digit

我遇到了一个处理python isdigit函数的奇怪问题.

例如:

>>> a = u'\u2466'
>>> a.isdigit()
Out[1]: True
>>> a.isnumeric()
Out[2]: True
Run Code Online (Sandbox Code Playgroud)

为什么这个角色是数字?

有什么办法让这个返回False,谢谢?


编辑,如果我不想将其视为数字,那么如何过滤掉它?

例如,当我尝试将其转换为int时:

>>> int(u'\u2466')
Run Code Online (Sandbox Code Playgroud)

然后UnicodeEncodeError发生了.

NPE*_*NPE 22

U + 2466是CIRCLED DIGIT SEVEN(⑦),所以是的,它是一个数字.

如果您对数字的定义与Unicode Consortium的定义不同,则可能必须编写自己的isdigit()方法.

编辑,如果我不想将其视为数字,那么如何过滤掉它?

如果您只对ASCII数字感兴趣0... 9,您可以执行以下操作:

In [4]: s = u'abc 12434 \u2466 5 def'

In [5]: u''.join(c for c in s if '0' <= c <= '9')
Out[5]: u'124345'
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`a in string.digits`. (7认同)

geo*_*org 8

如果你要将某些东西转换成int你需要isdecimal而不是isdigit.

请注意,"十进制"不仅仅是0,1,2,... 9,有多个字符可以解释为十进制数字并转换为整数.例:

#coding=utf8

s = u"1???5"
print s.isdecimal() # True
print int(s) # 12345
Run Code Online (Sandbox Code Playgroud)