• 使用该模块 regex .
  • 使用功能 [split()](https://blog.finxter.com/python-string-split/) y [append()](https://blog.finxter.com/python-list-append/) 在一个 列表 中。
  • 使用一个 列表理解 的函数 [isdigit()](https://blog.finxter.com/python-string-isdigit/) split()
  • 使用num_from_string模块。
  • 在你的编程生涯中,从一个给定的字符串中提取数位或数字可能经常会出现。无论你是在自动化Python脚本,想从CSV文件中提取某些数字,还是你是一个数据科学家,需要从给定的模式中分离出复杂的数字和号码,或者你是一个Python爱好者,想了解更多关于字符串和数字数据类型,这篇文章肯定会派上用场。话虽如此,让我们来探讨一下我们的关键问题。

    问题 给定一个字符串;如何用Python从字符串中提取数字?

    例子 设想你得到了一个字符串,你想从这个字符串中提取所有的数字,如下例所示。

    给出以下字符串。

    Extract 100, 1000 and 10000 from this string
    

    这就是所需的输出。

    [100, 1000, 10000]
    

    让我们来讨论一下我们可以用什么方法来从给定的字符串中提取数字。

    方法1:使用regex模块

    解决我们问题的最有效方法是利用模块的力量regex 。你可以很容易地使用正则表达式**(RegEx**)来检查或验证一个给定的字符串是否包含一个指定的模式(无论是一个数字或一个特殊字符或任何其他模式)。

    因此,为了解决我们的问题,我们需要导入regex模块,它包含在标准Python库中,然后在findall() 函数的帮助下,我们可以从给定的字符串中提取数字。

    findall() 是一个易于使用的regex函数,返回一个包含所有匹配的列表。要了解更多关于findall() ,请看我们的博客教程

    让我们看看下面的代码,了解我们如何使用regex 模块来解决我们的问题。

    import re
    sentence = 'Extract 100 , 100.45 and 10000 from this string'
    s = [float(s) for s in re.findall(r'-?\d+\.?\d*', sentence)]
    print(s)
    
    [100.0, 100.45, 10000.0]
    

    方法2:使用split()和append()函数将数字分割并追加到列表中。

    另一个解决我们问题的方法是用函数split() 来分割给定的字符串,用内置方法提取数字。 [float()](https://blog.finxter.com/python-float-function/)并将提取的数字追加到列表中。

  • split()是一个内置的 Python 方法,用于将一个字符串分割成一个列表。
  • append()是一个内置的 Python 方法,它将一个元素添加到一个列表的末尾。
  • 现在我们有了必要的工具来解决基于上述概念的问题,让我们更深入地挖掘代码,看看它是如何工作的。

    sentence = 'Extract 100 , 100.45 and 10000 from this string'
    s = []
    for t in sentence.split():
        try:
            s.append(float(t))
        except ValueError:
    print(s)
    
    [100.0, 100.45, 10000.0]
    

    方法3:在列表理解中使用isdigit()函数

    解决我们问题的另一种方法是使用内置函数isdigit() ,从字符串中提取数字,然后用列表理解法将其存储在一个列表中。isdigit() 函数用于检查一个给定的字符串是否包含数字。因此,如果它发现一个字符是数字,就会返回True ,否则就会返回False

    让我们看一下下面的代码,看看上述概念是如何运作的。

    sentence = 'Extract 100 , 100.45 and 10000 from this string'
    s = [int(s) for s in str.split(sentence) if s.isdigit()]
    print(s)
    
    [100, 10000]
    

    ☢ 警告!这种技术只适用于提取正整数。它对负整数、浮点数或十六进制数字不起作用。

    方法4:使用字符串库中的数字

    这是一个快速的技巧,可以避免浪费编写代码的时间,明确地从一个字符串中提取数字。你可以导入一个称为nums_from_string 的库,然后用它从一个给定的字符串中提取数字。它包含几个规则regex ,覆盖面很广,可以成为NLP研究人员的一个非常有用的工具。

    由于Numbers from String库不是标准Python库的一部分,你必须在使用它之前安装它。使用下面的命令来安装这个有用的库。

    pip install nums_from_string
    

    下面的程序演示了nums_from_string 的使用。

    import nums_from_string
    sentence = 'Extract 100 , 100.45 and 10000 from this string'
    print(nums_from_string.get_nums(sentence))
    
    [100.0, 100.45, 10000.0]
    

    所以,从上面的解释中,我们发现在python中,有几种方法可以从给定的字符串中提取出一个数字。然而,我个人最喜欢的肯定是regex模块。可以说,使用其他方法,如函数isdigit()split() ,可以提供更简单、更易读的代码,而且速度更快。然而,如上所述,它不能返回负数(参照方法2),也不能处理中间没有空格的浮点数和其他字符,如"25.50k" (参照方法2)。另外,当涉及到处理记录时,速度是一个不相关的指标。现在你知道为什么在这个解决方案的列表中,regex是我个人最喜欢的。