python中str.isdigit,isnumeric和isdecimal之间的区别是什么?

时间:2017-07-03 17:22:45

标签: python string python-3.x

当我运行这些方法时

s.isdigit()
s.isnumeric()
s.isdecimal()

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

5 个答案:

答案 0 :(得分:37)

主要是关于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

具体行为在官方文档here中。

找到所有这些的脚本:

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)

答案 1 :(得分:21)

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字符的方式。

答案 2 :(得分:4)

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

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

+-------------+-----------+-------------+----------------------------------+
| isdecimal() | isdigit() | isnumeric() |          Example                 |
+-------------+-----------+-------------+----------------------------------+
|    True     |    True   |    True     | "038", "੦੩੮", "038"           |
|  False      |    True   |    True     | "⁰³⁸", "⒊⒏", "⓪③⑧"          |
|  False      |  False    |    True     | "↉⅛⅘", "ⅠⅢⅧ", "⑩⑬㊿", "壹貳參"  |
|  False      |  False    |  False      | "abc", "38.0", "-38"             |
+-------------+-----------+-------------+----------------------------------+

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
"0123456789"  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

2。字符isdecimal()==Falseisdigit()==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

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

答案 3 :(得分:0)

这三个数字全部为负a = "-10"将为假

a.isdecimal(), a.isdigit(), a.isnumeric()

是     错误,错误,错误 isdecimal()在任何语言中都只有0到9,但没有负号 isdigit()在任何语言中都将只有0到9,并且在“至幂”位置也是如此。 (幂的小数,例如:2到5的幂)。 isnumeric()的范围更广。.在任何位置都将包含大于0到9,但是在任何语言中,ex。也将包含成百上千。罗马10是X,其有效的isnumeric()。 但是这三个都不是对的: 负数,例如:-10 和浮点数,例如:10.1

答案 4 :(得分:-1)

相关问题:正则表达式中哪一个等效于“ \ d”?

“ \ d”:对于Unicode(str)模式: 匹配任何Unicode十进制数字(即Unicode字符类别[Nd]中的任何字符)。其中包括[0-9],以及许多其他数字字符。如果仅使用ASCII标志,则仅匹配[0-9]。