1

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

整数可以明确指定为十进制、二进制、八进制或十六进制形式。所有这些形式都可以以可选符号开头,可以是“+”或“-”,在它和整数的其余部分之间没有分隔字符。

十进制整数可以是单个零或以非零十进制数字开头的一个或多个十进制数字的序列。十进制数字是 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 既是错误的八进制数又是错误的十进制数。

我想我只是在如何让程序弄清楚它是什么数字方面遇到了麻烦。

4

1 回答 1

4

作为起点,您可以尝试使用带有0参数的int()函数来计算转换:

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

也就是说,正则表达式是区分确切规格的最佳选择。例如,这是一个十六进制识别器:

>>> 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
于 2013-06-13T02:35:27.873 回答