2

如果有人感兴趣,这是正则表达式的后续,以匹配 Python 整数文字

tokenize模块对于分解 Python 表达式很有用,但tokenize.NUMBER不是很有表现力,因为它表示各种数字文字,例如,,(11lPython 2 中),,,,,,,,并且都被认为是 NUMBER(以及所有前一个用大写字母)。标准库中是否有一个函数可以告诉我上面的内容是什么?我特别关心我是否有整数或浮点数(复数也被认为是浮点数),但进一步的表现力也可以:)。基本上,我不想自己尝试捕捉所有可能的数字文字,因为我已经成功地做错了一次。 0xf21e-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”类型。这些文字字符串立即转换为其十进制等价物。

这很好用:

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 回答