2

興味のある方のために説明すると、これはPython 整数リテラルに一致する正規表現のフォローアップです。

このモジュールは、tokenizePython 式を分割するのに便利ですが、すべての種類の数値リテラルtokenize.NUMBERを表すため、あまり表現力がありません。前は大文字)。私が持っている上記の種類を教えてくれる標準ライブラリに関数はありますか? 私は整数または浮動小数点数 (複素数も浮動小数点数と見なされます) を持っているかどうかを特に気にしますが、それ以上の表現力も問題ありません:)。基本的に、考えられるすべての数値リテラルを自分でキャッチしようとはしません。一度間違ったことをしてしまったからです。 11l0xf21e-101.10b1010o171j

4

3 に答える 3

3

ast.literal_evalを使用して、Pythonの数値形式をint、float、またはlongに解析できます。

>>> ast.literal_eval('1')
1
>>> ast.literal_eval('1l')
1L
>>> ast.literal_eval('0x2')
2
>>> ast.literal_eval('0b1101')
13

Pythonには「hex」または「oct」または「bin」タイプがないことに注意してください。これらのリテラル文字列は、すぐに同等の10進数に変換されます。

これはかなりうまく機能します:

def numtype(s):
    numtypes=[int,long,float,complex]

    try:
        n=ast.literal_eval(s)
    except SyntaxError:
        return None

    if type(n) not in numtypes:
        return None  
    else:
        return type(n)    

for t in ['1','0x1','0xf2','1e-10','0o7','1j', '0b1101']:
    print t, numtype(t)              

プリント:

1 <type 'int'>
0x1 <type 'int'>
0xf2 <type 'int'>
1e-10 <type 'float'>
0o7 <type 'int'>
1j <type 'complex'>
0b1101 <type 'int'>

異なる小数タイプを本当に区別する必要がある場合は、次のようにすることができます。

def numtype(s):
    numtypes=[int,long,float,complex]

    try:
        n=ast.literal_eval(s)
    except SyntaxError:
        return None

    if type(n) not in numtypes:
        return None    

    if type(n) != int:
        return type(n)
    else:
        if 'x' in s.lower():
            return 'HEX'
        if 'o' in s.lower():
            return 'OCT'   
        if 'b' in s.lower():
            return 'BIN'     

        return int
于 2012-08-08T22:30:29.750 に答える
2

もしかしてast.literal_eval

type(ast.literal_eval(s))
于 2012-08-08T22:33:14.787 に答える
0
def is_int(number_string):
    try:
        i = int(number_string)
    except ValueError:
        return False
    return True
于 2012-08-08T22:36:02.553 に答える