выяснить, является ли число десятичным, шестнадцатеричным или восьмеричным в python

Я пытаюсь создать небольшую программу, которая считывает файл только с одним числом, а затем программа выводит десятичное, шестнадцатеричное или восьмеричное число, а затем отображает само число. Вот правила, которые я установил для разрешенных номеров:

Целое число может быть однозначно указано в десятичной, двоичной, восьмеричной или шестнадцатеричной форме. Все эти формы могут начинаться с необязательного знака, которым может быть «+» или «-» без разделительных символов между ним и остальной частью целого числа.

Десятичное целое может быть одним нулем или последовательностью одной или нескольких десятичных цифр, начинающейся с отличной от нуля десятичной цифры. Десятичные цифры: 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 — одновременно неправильное восьмеричное и десятичное число.

Я думаю, у меня просто проблемы с тем, как заставить программу выяснить, что это за число.


person pfinferno    schedule 13.06.2013    source источник
comment
Для таких задач следует использовать разработку через тестирование. Другими словами, вы определяете тест для каждого угла спецификации, а затем корректируете свой код для правильной обработки этого случая. Обратите внимание, что вы также можете разделить задачу, так как выяснение того, какое представление используется, означает возможность сначала обнаружить любое представление, то есть функцию «да/нет», сообщающую вам для каждого основания, содержит ли какой-либо текст число с этим основанием.   -  person Ulrich Eckhardt    schedule 26.07.2014


Ответы (1)


В качестве отправной точки вы можете попробовать использовать int() function с аргументом 0, чтобы она вычисляла преобразование:

>>> 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
person Raymond Hettinger    schedule 13.06.2013