我有一个存储数字和单位的字符串,例如
x= '$120'
y = ' 90 Degrees F'
banana = '200 kgm'
orange = '300 gm'
total_weight = banana + orange/1000
例如我想添加权重
total_weight = 200 + 300/1000
谢谢!
我正在尝试提取数字只是为了用这些来做一些操作......任何想法最简单的方法是什么?我只处理这两种格式,即数字位于字符串的开头或结尾......
答案 0 :(得分:62)
从字符串中提取数字的最简单方法是使用正则表达式和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]
答案 1 :(得分:31)
不使用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
编辑:
回答后续问题。
如果我们知道给定字符串中唯一的句点是小数点,则提取浮点数非常简单:
def get_num(x):
return float(''.join(ele for ele in x if ele.isdigit() or ele == '.'))
结果:
>>> get_num('dfgd 45.678fjfjf')
45.678
答案 2 :(得分: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')
一样访问指定的群组。
我认为这应该可以帮助您入门。
答案 3 :(得分:2)
>>> x='$120'
>>> import string
>>> a=string.maketrans('','')
>>> ch=a.translate(a, string.digits)
>>> int(x.translate(a, ch))
120
答案 4 :(得分: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)