0

Python のような文字列があり、 (unsigned int のように)x='0x08h, 0x0ah'に変換したいと考えています。[8,10]分割してインデックスを作成することもできます[int(a[-3:-1],16) for a in x.split(', ')]が、int のリストに変換するより良い方法はありますか?

私が持っていたとしても問題でしょうy='080a'か?

編集(プラスポイントの場合:))どの(正気の)文字列ベースの16進数表記がPythonをサポートしていて、どれがサポートしていないのですか?

4

2 に答える 2

2

パーサーを作成する前に、解析しようとしているパターンが何であるかを知る必要があります。

しかし、あなたのパターンは次のように見えます: optional 0x、次に 16 進数、次に optional 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 はプレフィックスを 16 進文字列の一部として受け入れるため、次のように記述できます。

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

ただし、より明確にすると、意図がより明確になると思います。


あなたの編集から:

どの (正気の) 文字列ベースの 16 進数表記が Python をサポートしていて、どれがサポートしていないかを編集します。

のドキュメントを参照してくださいint

基数 2、-8、および -16 のリテラルには、コード内の整数リテラルと同様に、オプションで 0b/0B、0o/0O、または 0x/0X をプレフィックスとして付けることができます。

それでおしまい。(パラグラフの残りの部分を読んで、 があることが保証されている0x/0X場合は、base=16 を明示的に使用する必要はありません。しかし、それはここでは役に立たないため、1 つの文だけで十分です。)数値型数値リテラルに関するドキュメントでは、「コード内の整数リテラルと同様に」正確に詳しく説明しています。唯一驚くべきことは、負の数はリテラルではなく、複素数はリテラルではなく (ただし、純粋な虚数はそうです)、非 ASCII 数字を使用できますが、ドキュメントではその方法が説明されていないことです。

于 2013-10-02T18:43:17.030 に答える