如何在Python中从字符串中提取数字并返回一个列表?

3
我试图在文本中找到所有的数字,并将它们返回为浮点数列表。
在文本中:
- 逗号用于分隔千位。 - 几个连续的数字由逗号和空格分隔。 - 数字可以附加在单词后面。
text = "30feet is about 10metre but that's 1 rough estimate several numbers are like 2, 137, and 40 or something big numbers are like 2,137,040 or something"

我需要返回一个浮点数列表,其中逗号之间没有引号。

Eg. 
extract_numbers("1, 2, 3, un pasito pa'lante Maria")
    is [1.0, 2.0, 3.0]

很遗憾,我当前尝试的输出结果是一个字符串:

def extract_numbers(text):
  nums = re.findall(r'\b\d{1,3}(?:,\d{3})*(?:\.\d+)?(?!\d)', text)
  
    return (("[{0}]".format( 
                       ', '.join(map(str, nums))))) 

extract_numbers(TEXT_SAMPLE)

如何在列表中返回数字?

3个回答

3

您可以从匹配结果中删除所有逗号,然后将结果映射到float

您可以使用

def extract_numbers(text):
  return [float(x.replace(',','')) for x in re.findall(r'\b\d{1,3}(?:,\d{3})*(?:\.\d+)?(?!\d)', text)]

请查看Python演示

import re
 
TEXT_SAMPLE = "30feet is about 10metre but that's 1 rough estimate several numbers are like 2, 137, and 40 or something big numbers are like 2,137,040 or something"
 
def extract_numbers(text):
  return [float(x.replace(',','')) for x in re.findall(r'\b\d{1,3}(?:,\d{3})*(?:\.\d+)?(?!\d)', text)]
 
print(extract_numbers(TEXT_SAMPLE))

# => [30.0, 10.0, 1.0, 2.0, 137.0, 40.0, 2137040.0]

1
@Sundeep 对的,我只是快速地适应了原始代码而没有进一步压缩它。 - Wiktor Stribiżew

1
这应该以简洁的方式完成。
import re  
def extract_numbers(txt):
    return [float(r.replace(',', '')) for r in re.findall(r'[\d,]+', txt)]

它首先会查找和分组所有没有分隔符的数字和逗号,然后返回这些数字。

是的,这个样例也可以工作。虽然有一些规范列表,但我想不出任何一个会在这个解决方案中失败的情况。 - Sundeep

0

这是有点业余的代码,但我想它能够工作。

  text = """30feet is about 10metre but that's 1 rough estimate several
  numbers are like 2, 137, and 40 or something big numbers are like 2,
  137,040 or something"""
  def extract_numbers(text):
    numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
    _numbers = []
    a=0
    while(a<len(text)):
      i=text[a]
      if(i in numbers):
        number=""
        while(text[a] in numbers):
          number+=text[a]
          a+=1
        _numbers.append(number)
      else:
        a+=1
    float_numbers=list()
    for i in _numbers:
      float_numbers.append(float(i))
    return float_numbers
print(extract_numbers(text))

输出:[30.0,10.0,1.0,2.0,137.0,40.0,2.0,137.0,40.0]

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