Преобразование "0x08h, 0x8ah" в [int,int] в Python

У меня есть строка как x='0x08h, 0x0ah' в Python, желая преобразовать его в [8,10] (как неподписанные целые). Я мог бы разбить и проиндексировать это как [int(a[-3:-1],16) for a in x.split(', ')] но есть ли лучший способ преобразовать его в список целых?

Было бы важно, если бы я y='080a'?

редактировать (для плюсов:).) Какие (нормальные) шестнадцатеричные нотации на основе строк поддерживают Python, а какие нет?

2 ответа

Решение

Вы действительно должны знать, какой шаблон вы пытаетесь проанализировать, прежде чем писать парсер.

Но похоже, что ваш шаблон: необязательно 0x, затем шестнадцатеричные цифры, затем необязательно h, По крайней мере, это самая разумная вещь, которую я могу придумать, которая обрабатывает оба '0x08h' а также '080a', Так:

def parse_hex(s):
    return int(s.lstrip('0x').rstrip('h'), 16)

Затем:

numbers = [parse_hex(s) for s in x.split(', ')]

Конечно, вам на самом деле не нужно удалять 0x префикс, потому что Python принимает это как часть шестнадцатеричной строки, так что вы можете написать это как:

def parse_hex(s):
    return int(s.rstrip('h'), 16)

Тем не менее, я думаю, что намерение яснее, если вы будете более явными.


Из вашего редактирования:

отредактируйте, какие (нормальные) основанные на строках шестнадцатеричные примечания имеют поддержку Python, а какие нет?

Смотрите документацию для int:

Литералы Base-2, -8 и -16 могут иметь префикс 0b/0B, 0o/0O или 0x/0X, как и целочисленные литералы в коде.

Вот и все. (Если вы прочитаете остальную часть абзаца, если вы гарантированно 0x/0X вам не нужно явно использовать base=16. Но это вам здесь не поможет, так что одно предложение - это действительно все, что вам нужно. Документы по числовым типам и числовым литералам подробно описывают, что "как с целочисленными литералами в коде"; единственное, что удивляет, это то, что отрицательные числа не являются литералами, комплексные числа не являются литералами (но это чисто мнимые числа), и могут использоваться не-ASCII-цифры, но документация не объясняет, как.

Вы также можете использовать map: map(lambda s:int(s.lower().replace('0x','').replace('h',''), 16),x.split(', '))

Другие вопросы по тегам