【问题标题】:Check string for numbers in Python在 Python 中检查字符串中的数字
【发布时间】:2011-08-04 13:00:39
【问题描述】:

Python中如何判断字符串是否包含数字?

我有一个要转换为浮点数的变量,但我想制作 if 语句,仅当它只包含数字时才将其转换为浮点数。

【问题讨论】:

  • 还有一点,变量中的数字就像“0.123”
  • 转换为浮点数仍然有效

标签: python string numbers


【解决方案1】:

只要转换它,如果失败就捕获异常。

s = "3.14"
try:
  val = float(s)
except ValueError:
  val = None

【讨论】:

  • 我认为这是最快的方法。
  • 这让我们“NaN”(不是数字)通过。要明确检查那些使用math.isnan(s)
  • @razz0 提出了一个很好的观点。这种方法还允许“inf”和“-inf”通过,它们也不是数字;这些可以通过math.isinf 进行检查。虽然不是数字,但所有三个都是有效的浮点数,因此是否包含它们可能取决于这些浮点数的预期用途。
  • 如何在带有 lambda 的 filter() 函数中执行此操作?
【解决方案2】:

我会使用 try-except 块来确定它是否是一个数字。这样,如果 s 是一个数字,则强制转换成功,如果不是,则捕获 ValueError,因此您的程序不会中断。

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

【讨论】:

  • 既然你解释得最多,你的答案就更好了!谢谢你们,迈克尔和亨特!
【解决方案3】:

您还可以从字符串中提取数字。

import string
extract_digits = lambda x: "".join(char for char in x if char in string.digits + ".")

然后将它们转换为浮点数。

to_float = lambda x: float(x) if x.count(".") <= 1 else None

>>> token = "My pants got 2.5 legs"
>>> extract_digits(token)
'2.5'
>>> to_float(_)
2.5
>>> token = "this is not a valid number: 2.5.52"
>>> extract_digits(token)
'2.5.52'
>>> to_float(_)
None

【讨论】:

    【解决方案4】:

    为什么不为此使用内置的.isdigit()。紧凑,没有try 语句,而且超级快:

    string = float(string) if string.isdigit() else string
    

    在考虑 Python 中的错误处理时,我相信是尤达大师说过,“没有尝试。做或不做。”

    【讨论】:

      【解决方案5】:

      Michael Barber 的回答对于速度来说是最好的,因为没有不必要的逻辑。如果由于某种原因您发现需要进行更精细的评估,您可以使用 Python 标准库的正则表达式模块。如果您决定,例如,您想要获得您所描述的数字,但有您想要叠加的其他标准,这将对您有所帮助。

      import re
      mystring = '.0323asdffa'
      
      def find_number_with_or_without_decimal(mystring):
          return re.findall(r"^\.?\d+", mystring)
      
      In [1]: find_number_with_or_without_decimal(mystring)
      Out[1]: ['.0323']
      

      正则表达式说,'找到以最多一位小数开头的东西('^'表示仅在行首,'?'表示最多一位;小数用'\'转义,所以它赢了'没有其特殊的正则表达式含义'任何字符')并且具有任意数量的数字。祝 Python 好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 2015-05-29
        • 2017-04-18
        相关资源
        最近更新 更多