Вопрос по python – извлекать цифры простым способом из строки Python [дубликата]
This question already has an answer here:
Python: Extract numbers from a string 13 answersУ меня есть строка, которая хранит число и единицу, например
x= '$120'
y = ' 90 Degrees F'
banana = '200 kgm'
orange = '300 gm'
total_weight = banana + orange/1000
и, например, я хочу добавить веса
total_weight = 200 + 300/1000
Спасибо!
Я пытаюсь извлечь числа только для того, чтобы выполнить некоторые операции с ними ... есть ли у вас представление о том, как проще всего это сделать? Я имею дело только с этими двумя форматами, то есть цифры находятся в начале или в конце строки ...
orange
от1000
именно по этой причине
kgm
и оранжевый вgm
Конечно, это означает, что веса200000
а также300
не200
а также300
, что добавляет сложности к проблеме. Это имеет значение для вас?
import re
re_float = re.compile(r'\d*\.?\d+')
Вы также можете добавить группу к выражению, которое улавливает ваши единицы веса.
re_banana = re.compile(r'(?P<number>\d*\.?\d+)\s?(?P<uni>[a-zA-Z]+)')
Вы можете получить доступ к названным группам, как этоre_banana.match("200 kgm").group('number')
.
Я думаю, что это должно помочь вам начать.
regex
Вы можете просто сделать:
def get_num(x):
return int(''.join(ele for ele in x if ele.isdigit()))
Результат:
>>> get_num(x)
120
>>> get_num(y)
90
>>> get_num(banana)
200
>>> get_num(orange)
300
EDIT :
Отвечая на следующий вопрос.
Если мы знаем, что единственным периодом в данной строке является десятичная точка, извлечь значение с плавающей запятой довольно просто:
def get_num(x):
return float(''.join(ele for ele in x if ele.isdigit() or ele == '.'))
Результат:
>>> get_num('dfgd 45.678fjfjf')
45.678
выражения иfindall
.
>>> import re
>>> s = '300 gm'
>>> re.findall('\d+', s)
['300']
>>> s = '300 gm 200 kgm some more stuff a number: 439843'
>>> re.findall('\d+', s)
['300', '200', '439843']
Возможно, вам нужно что-то более сложное, но это хороший первый шаг.
Обратите внимание, что вам все равно придется звонитьint
на результат, чтобы получить правильный числовой тип (а не другую строку):
>>> map(int, re.findall('\d+', s))
[300, 200, 439843]
'\d+'
Error: User Rate Limit Exceeded
import re re.findall("[a-z]", "abcccd ff")
Error: User Rate Limit Exceeded"abcccd ff"
возможно, вы также захотите узнать единицы измерения. Учитывая ваши входные ограничения (что входная строка содержит только единицу и значение), это должно правильно возвращать оба (вам просто нужно выяснить, как преобразовать единицы в общие единицы для вашей математики).
def unit_value(str):
m = re.match(r'([^\d]*)(\d*\.?\d+)([^\d]*)', str)
if m:
g = m.groups()
return ' '.join((g[0], g[2])).strip(), float(g[1])
else:
return int(str)