python中的str.isdigit,isnumeric和isdecimal有什么区别?

use*_*026 43 python string python-3.x

当我运行这些方法时

s.isdigit()
s.isnumeric()
s.isdecimal()
Run Code Online (Sandbox Code Playgroud)

我总是得到输出或全部为True,或者每个s的值都为False(当然是一个字符串).这三者有什么区别?你能提供一个给出两个真实和一个假(或反之亦然)的例子吗?

wim*_*wim 45

它主要是关于unicode分类.以下是一些显示差异的示例:

>>> def spam(s):
...     for attr in 'isnumeric', 'isdecimal', 'isdigit':
...         print(attr, getattr(s, attr)())
...         
>>> spam('½')
isnumeric True
isdecimal False
isdigit False
>>> spam('³')
isnumeric True
isdecimal False
isdigit True
Run Code Online (Sandbox Code Playgroud)

具体行为在这里的官方文档中.

找到所有这些的脚本:

import sys
import unicodedata
from collections import defaultdict

d = defaultdict(list)
for i in range(sys.maxunicode + 1):
    s = chr(i)
    t = s.isnumeric(), s.isdecimal(), s.isdigit()
    if len(set(t)) == 2:
        try:
            name = unicodedata.name(s)
        except ValueError:
            name = f'codepoint{i}'
        print(s, name)
        d[t].append(s)
Run Code Online (Sandbox Code Playgroud)


Chr*_*ean 27

Python文档说明了这三种方法之间的区别.

str.isdigit

如果字符串中的所有字符都是数字并且至少有一个字符,则返回true,否则返回false.数字包括十进制字符和需要特殊处理的数字,例如兼容性上标数字.这包括不能用于在基数10中形成数字的数字,如Kharosthi数字.形式上,数字是具有属性值Numeric_Type = Digit或Numeric_Type = Decimal的字符.

str.isnumeric

如果字符串中的所有字符都是数字字符,则返回true,并且至少有一个字符,否则返回false.数字字符包括数字字符,以及具有Unicode数值属性的所有字符,例如U + 2155,VULGAR FRACTION ONE FIFTH.形式上,数字字符是具有属性值Numeric_Type = Digit,Numeric_Type = Decimal或Numeric_Type = Numeric的字符.

str.isdecimal

如果字符串中的所有字符都是十进制字符并且至少有一个字符,则返回true,否则返回false.十进制字符是可用于在基数10中形成数字的字符,例如U + 0660,ARABIC-INDIC DIGIT ZERO.正则小数字符是Unicode常规类别"Nd"中的字符.


就像@Wim所说,这三种方法的主要区别在于它们处理特定unicode字符的方式.

  • 这些是 Python API 中最无用且最容易产生误导的部分。我们确实需要一个“isfloat”,而名字不好的“isdecimal”和“isnumeric”很容易与它们混淆。 (3认同)

Ann*_*wan 12

根据定义,isdecimal()isdigit()isnumeric()。也就是说,如果字符串是decimal,那么它也将是digitnumeric

因此,给定一个字符串s并使用这三种方法对其进行测试,结果将只有4种。

+-------------+-----------+-------------+----------------------------------+
| isdecimal() | isdigit() | isnumeric() |          Example                 |
+-------------+-----------+-------------+----------------------------------+
|    True     |    True   |    True     | "038", "???", "???"           |
|  False      |    True   |    True     | "?³?", "??", "???"          |
|  False      |  False    |    True     | "???", "???", "???", "???"  |
|  False      |  False    |  False      | "abc", "38.0", "-38"             |
+-------------+-----------+-------------+----------------------------------+
Run Code Online (Sandbox Code Playgroud)

1.一些字符示例 isdecimal()==True

(因此isdigit()==Trueisnumeric()==True

"0123456789"  DIGIT ZERO~NINE
"??????????"  ARABIC-INDIC DIGIT ZERO~NINE
"??????????"  DEVANAGARI DIGIT ZERO~NINE
"??????????"  BENGALI DIGIT ZERO~NINE
"??????????"  GURMUKHI DIGIT ZERO~NINE
"??????????"  GUJARATI DIGIT ZERO~NINE
"??????????"  ORIYA DIGIT ZERO~NINE
"??????????"  TAMIL DIGIT ZERO~NINE
"??????????"  TELUGU DIGIT ZERO~NINE
"??????????"  KANNADA DIGIT ZERO~NINE
"??????????"  MALAYALAM DIGIT ZERO~NINE
"??????????"  THAI DIGIT ZERO~NINE
"??????????"  LAO DIGIT ZERO~NINE
"??????????"  TIBETAN DIGIT ZERO~NINE
"??????????"  MYANMAR DIGIT ZERO~NINE
"??????????"  KHMER DIGIT ZERO~NINE
"??????????"  FULLWIDTH DIGIT ZERO~NINE
""  MATHEMATICAL BOLD DIGIT ZERO~NINE
""  MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO~NINE
""  MATHEMATICAL SANS-SERIF DIGIT ZERO~NINE
""  MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO~NINE
""  MATHEMATICAL MONOSPACE DIGIT ZERO~NINE
Run Code Online (Sandbox Code Playgroud)

2.一些字符的例子,isdecimal()==False但是isdigit()==True

(因此isnumeric()==True

"?¹²³??????"  SUPERSCRIPT ZERO~NINE
"??????????"  SUBSCRIPT ZERO~NINE
"?????????"  DIGIT ZERO~NINE FULL STOP
""  DIGIT ZERO~NINE COMMA
"??????????"  CIRCLED DIGIT ZERO~NINE
"??????????"  NEGATIVE CIRCLED DIGIT ZERO~NINE
"?????????"  PARENTHESIZED DIGIT ONE~NINE
"?????????"  DINGBAT CIRCLED SANS-SERIF DIGIT ONE~NINE
"?????????"  DOUBLE CIRCLED DIGIT ONE~NINE
"?????????"  DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE~NINE
"?????????"  ETHIOPIC DIGIT ONE~NINE
Run Code Online (Sandbox Code Playgroud)

3.人物的一些例子isdecimal()==Falseisdigit()==False,但isnumeric()==True

"½?¼???????¾?????????"  VULGAR FRACTION
"??????"  BENGALI CURRENCY NUMERATOR
"???"  TAMIL NUMBER TEN, ONE HUNDRED, ONE THOUSAND
"???????"  TELUGU FRACTION DIGIT
"??????"  MALAYALAM NUMBER, MALAYALAM FRACTION
"??????????"  TIBETAN DIGIT HALF ZERO~NINE
"???????????"  ETHIOPIC NUMBER TEN~NINETY, HUNDRED, TEN THOUSAND
"??????????"  KHMER SYMBOL LEK ATTAK
"????????????????"  ROMAN NUMERAL
"????????????????"  SMALL ROMAN NUMERAL
"?????"  ROMAN NUMERAL
"?????????????????????????????????????????"  CIRCLED NUMBER TEN~FIFTY
"????????"  CIRCLED NUMBER TEN~EIGHTY ON BLACK SQUARE
"???????????"  PARENTHESIZED NUMBER TEN~TWENTY
"???????????"  NUMBER TEN~TWENTY FULL STOP
"??????????"  NEGATIVE CIRCLED NUMBER ELEVEN
"????"  various styles of CIRCLED NUMBER TEN
""  DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO
"?"  IDEOGRAPHIC NUMBER ZERO
"????????????"  HANGZHOU NUMERAL ONE~TEN, TWENTY, THIRTY
"????"  IDEOGRAPHIC ANNOTATION ONE~FOUR MARK
"??????????"  PARENTHESIZED IDEOGRAPH ONE~TEN
"??????????"  CIRCLED IDEOGRAPH ONE~TEN
"?????????????????????????????????????????????????"  CJK UNIFIED IDEOGRAPH
"???????"  CJK COMPATIBILITY IDEOGRAPH
""  AEGEAN NUMBER ONE~NINE, TEN~NINETY
""  AEGEAN NUMBER ONE~NINE HUNDRED, ONE~NINE THOUSAND
""  AEGEAN NUMBER TEN~NINETY THOUSAND
""  GREEK ACROPHONIC ATTIC
""  COUNTING ROD UNIT DIGIT ONE~NINE
""  COUNTING ROD TENS DIGIT ONE~NINE
Run Code Online (Sandbox Code Playgroud)

  • 两种方法都有效。我建议您亲自尝试一下。 (5认同)
  • `"⒊⒏"` 真的让我很困惑,因为我以为这只是 `"0.3.8."`。只有在复制+粘贴到 REPL 后我才意识到它们是 unicode 字符。 (2认同)
  • 你的表毫无意义。第 1 行 - 您为“038”调用每个函数 1 次?或者您是否为“038”、“੦੩੮”、“038”调用每个函数 3 次,并且每个函数对所有“038”、“੦੩੮”、“038”`返回相同的结果? (2认同)
  • 是否有像`all(c in "0123456789" for c in s)`这样的函数? (2认同)