从python字符串以简单的方式提取数字

extract digits in a simple way from a python string

本问题已经有最佳答案,请猛点这里访问。

例如,我有一个存储数字和单位的字符串

1
2
3
4
5
x= '$120'
y = ' 90 Degrees F'
banana = '200 kgm'
orange = '300 gm'
total_weight = banana + orange/1000

例如,我想增加重量

1
total_weight  = 200 + 300/1000

谢谢!

我试图提取这些数字只是为了对它们进行一些操作…你知道最简单的方法是什么吗?我只处理这两种格式,即数字在字符串的开头或结尾…


从字符串中提取数字的最简单方法是使用正则表达式和findall

1
2
3
4
5
6
7
>>> 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以获得正确的数字类型(而不是另一个字符串):

1
2
>>> map(int, re.findall('\d+', s))
[300, 200, 439843]


不使用regex,您只需执行以下操作:

1
2
def get_num(x):
    return int(''.join(ele for ele in x if ele.isdigit()))

结果:

1
2
3
4
5
6
7
8
>>> get_num(x)
120
>>> get_num(y)
90
>>> get_num(banana)
200
>>> get_num(orange)
300

编辑:

回答后续问题。

如果我们知道给定字符串中的唯一句点是小数点,那么提取浮点非常容易:

1
2
def get_num(x):
    return float(''.join(ele for ele in x if ele.isdigit() or ele == '.'))

结果:

1
2
>>> get_num('dfgd 45.678fjfjf')
45.678


这个正则表达式也处理浮动

1
2
import re
re_float = re.compile(r'\d*\.?\d+')

你也可以在表达式中添加一个组来捕捉你的重量单位。

1
re_banana = re.compile(r'(?P<number>\d*\.?\d+)\s?(?P<uni>[a-zA-Z]+)')

您可以访问这样的命名组re_banana.match("200 kgm").group('number')

我认为这会帮助你开始。


1
2
3
4
5
6
>>> x='$120'
>>> import string
>>> a=string.maketrans('','')
>>> ch=a.translate(a, string.digits)
>>> int(x.translate(a, ch))
120


如果你在用数字做某种数学运算,你可能还想知道单位。考虑到您的输入限制(输入字符串只包含单位和值),这应该正确地返回这两个值(您只需要弄清楚如何将单位转换为常用的数学单位)。

1
2
3
4
5
6
7
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)