#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]