在Python中将“0x08h,0x8ah”转换为[int,int]

时间:2013-10-02 18:40:01

标签: python hex ordinal-indicator

我在Python中有类似x='0x08h, 0x0ah'的字符串,希望将其转换为[8,10](如无符号整数)。我可以像[int(a[-3:-1],16) for a in x.split(', ')]那样拆分和索引它,但是有更好的方法将它转换为整数列表吗?

如果我有y='080a'吗?

编辑(对于加分:)。)什么(理智的)基于字符串的十六进制表示法有python支持,哪些没有?

2 个答案:

答案 0 :(得分: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.但这对您没有帮助,所以你只需要一个句子。)Numeric TypesNumeric literals上的文档详细说明了“与代码中的整数文字一样”;唯一令人惊讶的是,负数不是文字,复数不是文字(但是纯虚数),可以使用非ASCII数字,但文档没有解释如何。

答案 1 :(得分:0)

您还可以使用mapmap(lambda s:int(s.lower().replace('0x','').replace('h',''), 16),x.split(', '))