Как я могу извлечь числа из строки в Python и вернуть список?

#python #python-3.x #regex #extract #re

#python #python-3.x #регулярное выражение #извлечь #python-re

Вопрос:

Я пытаюсь найти все числа в тексте и вернуть их в виде списка с плавающей точкой.

В тексте:

  • Запятые используются для разделения тысяч
  • Несколько последовательных чисел разделяются запятой и пробелом
  • Числа могут быть присоединены к словам
 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'bd{1,3}(?:,d{3})*(?:.d )?(?!d)', text)
  
    return (("[{0}]".format( 
                       ', '.join(map(str, nums))))) 

extract_numbers(TEXT_SAMPLE)

  

Как я могу вернуть числа в списке?

Ответ №1:

Вы можете удалить все запятые из совпадений, а затем сопоставить результаты с float

Вы можете использовать

 def extract_numbers(text):
  return [float(x.replace(',','')) for x in re.findall(r'bd{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'bd{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 Правильно, я просто быстро адаптировал операционный код, не сокращая его дальше.

Ответ №2:

Это должно сделать трюк чистым способом.

 import re  
def extract_numbers(txt):
    return [float(r.replace(',', '')) for r in re.findall(r'[d,] ', txt)]
  

Сначала он найдет и сгруппирует все числа и запятые, которые не разделены, а затем вернет числа.

Комментарии:

1. да, это тоже работает для данного примера.. есть список спецификаций, но я не могу придумать случай, который потерпит неудачу с этим решением

Ответ №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"""
  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]