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 |
号
谢谢!
我试图提取这些数字只是为了对它们进行一些操作…你知道最简单的方法是什么吗?我只处理这两种格式,即数字在字符串的开头或结尾…
从字符串中提取数字的最简单方法是使用正则表达式和
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'] |
也许你需要更复杂的东西,但这是一个很好的第一步。
请注意,您仍然需要对结果调用
1 2 | >>> map(int, re.findall('\d+', s)) [300, 200, 439843] |
号
不使用
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]+)') |
您可以访问这样的命名组
我认为这会帮助你开始。
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) |
。