弄清楚python中的数字是十进制,十六进制还是八进制

时间:2013-06-13 02:33:54

标签: python hex decimal octal

我试图创建一个小程序来读取一个只有一个数字的文件,然后程序打印出它是十进制,十六进制还是八进制数,然后显示数字本身。这是我为允许的数字制定的规则:

可以十进制,二进制,八进制或十六进制形式明确指定整数。所有这些形式都可以从一个可选的标志开始,这可以是一个" +"或者" - "它与整数的其余部分之间没有分隔符。

十进制整数可以是单个零,也可以是以非零十进制数字开头的一个或多个十进制数字的序列。十进制数字为0,1,2,3,4,5,6,7,8和9。

八进制数以零开头,后跟一个零或非空八进制数字序列,以非零八进制数字开头。八进制数字是0,1,2,3,4,5,6或7中的一个。

十六进制数以零开头,后跟大写或小写" x",以及单个零或非零十六进制数字和零或更多的序列十六进制数字。十六进制数字包括十进制数字和字母a,b,c,d,e和f及其大写版本。

请注意此描述必须持续多长时间以确保其明确无误。 "领先的零"在任何表示中都不允许,例如,0x007是一个错误的十六进制数,007是一个错误的八进制数和一个坏的十进制数。

我想我只是在如何让程序找出它是什么类型的数字上遇到麻烦。

1 个答案:

答案 0 :(得分:4)

作为一个起点,您可以尝试使用带有 0 参数的int() function来让它找出转换:

>>> int('-0xFF', 0)
-255
>>> int('077', 0)
63
>>> int('125', 0)
125

也就是说,regular expression是区分您的确切规格的最佳选择。例如,这是一个十六进制识别器:

>>> import re
>>> is_hex = re.compile(
         r'^[+\-]?'                     # optional sign
          '0'                           # start with a zero
          '[xX]'                        # upper or lower case "x"
          '(0|'                         # single zero or
          '([1-9A-Fa-f][0-9A-Fa-f]*))$' # a non-zero hexadecimal digit and a
                                        # sequence of zero or more hexadecimal digits
).match

>>> bool(is_hex('-0x0'))
True
>>> bool(is_hex('-0x03'))
False
>>> bool(is_hex('-0x30A'))
True
>>> bool(is_hex('0x007'))
False