Вопрос по python – извлекать цифры простым способом из строки Python [дубликата]

23

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

Спасибо!

Я пытаюсь извлечь числа только для того, чтобы выполнить некоторые операции с ними ... есть ли у вас представление о том, как проще всего это сделать? Я имею дело только с этими двумя форматами, то есть цифры находятся в начале или в конце строки ...

Я хотел бы предложить вам взглянуть на повторный модуль. Регулярные выражения предназначены для извлечения структурированных данных из корпуса. Sushant Gupta
Я предположил, что это не было частью вопроса, поскольку он был жестко закодирован. jamylak
@jamylak Точно, это исправлено? Или это то, что может измениться? Gareth Latty
Он делитorange от1000 именно по этой причине jamylak
Ваш собственный пример показывает проблему здесь. банан вkgm и оранжевый вgmКонечно, это означает, что веса200000 а также300не200 а также300, что добавляет сложности к проблеме. Это имеет значение для вас? Gareth Latty

Ваш Ответ

5   ответов
4

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').

Я думаю, что это должно помочь вам начать.

Error: User Rate Limit Exceeded
30

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
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Ka Ra
2
>>> x='$120'
>>> import string
>>> a=string.maketrans('','')
>>> ch=a.translate(a, string.digits)
>>> int(x.translate(a, ch))
120
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
60

выражения и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]
Error: User Rate Limit Exceeded Ka Ra
Error: User Rate Limit Exceededdocs.python.org/2/library/re.html.
Error: User Rate Limit ExceededhereError: User Rate Limit Exceeded'\d+'Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededimport re re.findall("[a-z]", "abcccd ff")Error: User Rate Limit Exceeded"abcccd ff"
0

возможно, вы также захотите узнать единицы измерения. Учитывая ваши входные ограничения (что входная строка содержит только единицу и значение), это должно правильно возвращать оба (вам просто нужно выяснить, как преобразовать единицы в общие единицы для вашей математики).

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)

Похожие вопросы