测试Python字符串变量是否包含数字(整数、浮点数)或非数字字符串?

5
如果Python字符串变量中已经存储了整数、浮点数或非数字字符串,有没有一种简单的方法来测试该值的“类型”?
下面的代码是真实的(当然正确的):
>>> strVar = "145"
>>> print type(strVar)
<type 'str'>
>>>

但是是否有Python函数或其他方法可以让我从上面设置的strVar中返回'int'呢?

也许像下面这段无意义的代码和结果一样...

>>> print typeofvalue(strVar)
<type 'int'>

更多无意义的话:
>>> print type(unquote(strVar))
<type 'int'>

1
哦... var = "Hello 20" 中是否“包含一个数字”? - NullUserException
6个回答

12
import ast
def type_of_value(var):
    try:
       return type(ast.literal_eval(var))
    except Exception:
       return str

或者,如果你只想检查是否为整数,将第三行更改为 try 块内的代码:

int(var)
return int

只是打败我,但这可能更好。 - Thomas
2
你应该只捕获ValueError,否则当未导入ast时,你会忽略掉NameError。尽管如此还是要点赞。 - Sam Dolan
问题在于literal_eval可能会引发许多不同的错误...我会导入ast :) - JBernardo
就像@sdolan指出的那样,但也要注意捕获SyntaxError:“如果编译的源代码无效,则此函数引发SyntaxError,如果源代码包含空字节,则引发TypeError。” 这是来自compile()文档的内容,这也是该函数调用的内容。 - Demolishun

6
我会这样做:
def typeofvalue(text):
    try:
        int(text)
        return int
    except ValueError:
        pass

    try:
        float(text)
        return float
    except ValueError:
        pass

    return str

4

使用.isdigit()方法:

In [14]: a = '145'

In [15]: b = 'foo'

In [16]: a.isdigit()
Out[16]: True

In [17]: b.isdigit()
Out[17]: False

In [18]: 

感谢 Rafael - 我还没有测试,因为我不认识你的一些语法 - 但是相信如果我这样做了,它会起作用。事实证明,我的整数和浮点数可能是负数(纬度/经度)。 - PolyGeo
我最喜欢的是(对于简单的整数与字符串情况)。但也许“In”和“Out”这些东西会带来更多的伤害。 - Wolf

2
您可以使用内置的 isinstance() 函数来检查变量是否为数字类型:
isinstance(x, (int, long, float, complex))

这同样适用于字符串和Unicode文本类型:
isinstance(x, (str, unicode))

例如:

def checker(x):
    if isinstance(x, (int, long, float, complex)):
        print "numeric"
    elif isinstance(x, (str, unicode)):
        print "string"

>>> x = "145"
>>> checker(x)
string
>>> x = 145
>>> checker(x)
numeric

0
我会使用正则表达式。
def instring (a):

  if re.match ('\d+', a):
    return int(a)
  elsif re.match ('\d+\.\d+', a):
    return float(a)
  else:
    return str(a)

1
你应该在你的正则表达式中添加 ^[+-]?$。如果 OP 想要科学计数法,比如 3e+12,你还需要添加 ([eE][+-]\d+)? - JBernardo
@JBernardo:收到了...此外,这听起来像是用户输入;因此,可能需要更多的输入验证,导致正则表达式而不仅仅是“它是什么类型”。 - whitey04
感谢whitey04 - 我没有测试过,因为我不认识你的一些语法 - 但是相信如果我这样做了,它会起作用。 - PolyGeo
我几乎无法想象一种比这更不符合Python风格的方法来完成这个任务。 - Karl Knechtel

0

这里有一个简便的方法,可以不用导入ast模块来完成它。

    try:
        if len(str(int(decdata))) == len(decdata): return 'int'
    except Exception:
        return 'not int'

当然,'s'是您想要评估的字符串


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接