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

以简单的方式从python字符串中提取数字,python,Python,例如,我有一个存储数字和单位的字符串 x= '$120' y = ' 90 Degrees F' banana = '200 kgm' orange = '300 gm' total_weight = banana + orange/1000 例如,我想添加权重 total_weight = 200 + 300/1000 谢谢 我试图提取这些数字只是为了对这些进行一些运算。。。你知道最简单的方法是什么吗?我只处理这两种格式,即数字在字符串的开头或结尾 从字符串中提取数字的最简单方法是使用

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

x= '$120'
y = ' 90 Degrees F'
banana = '200 kgm'
orange = '300 gm'
total_weight = banana + orange/1000 
例如,我想添加权重

total_weight  = 200 + 300/1000
谢谢


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

从字符串中提取数字的最简单方法是使用正则表达式和
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
,以获得正确的数字类型(而不是另一个字符串):


这个正则表达式也处理浮点数

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\u banana=re.compile(r'(?P\d*\.?\d+)\s?(?P[a-zA-Z]+))
您可以访问这样的命名组
re\u 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
>>> get_num('dfgd 45.678fjfjf')
45.678
编辑:

回答后续问题

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

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

>>> get_num(x)
120
>>> get_num(y)
90
>>> get_num(banana)
200
>>> get_num(orange)
300
>>> get_num('dfgd 45.678fjfjf')
45.678

我建议您看看re模块。正则表达式用于从语料库中提取结构化数据。您自己的示例说明了这个问题。香蕉在
kgm
中,橙色在
gm
中,这当然意味着权重是
200000
300
,而不是
200
300
,这增加了问题的复杂性。这对你有关系吗?他用
橙色
除以
1000
来精确计算reason@jamylak没错,这是固定的吗?或者这是可以改变的?我认为这不是问题的一部分,因为它是硬编码的。这不起作用。。。试试看yourself@jaymylak谢谢你的指点。真讨厌!是否有任何方法可以编辑它,使其也适用于float?将return语句更改为float正确吗?如果有多个数字,这将不起作用。这对float数字有效吗?我对python世界非常陌生,我不知道d+代表什么。。感谢您的帮助:)您可以阅读不同的正则表达式,但
“\d+”
表示一个或多个数字(+表示一个或多个)。@KaRa“d”表示“任意十进制数字”,而“+”表示“匹配1个或多个重复”。有关详细信息,请参阅@KaRa。您应该了解正则表达式。例如
import re.findall(“[a-z]”,“abcccd ff”)
在字符串
“abcccd ff”
中逐个获取所有小写字母(a-z)!!!但前提是你的字符串中有一个数字!!!将是int(filter(str.isdigit,'90℉'))90 int(filter(str.isdigit,'120'))120 int(filter(str.isdigit,'200 kgm'))200 int(filter(str.isdigit,'300 gm'))300,因为(filter(str.isdigit,'300 gm 90'))30090这不处理科学符号或许多其他有趣的浮点值(例如nan,inf)香蕉='200 kgm'橙色='300 gm'香蕉=int(香蕉.替换('kgm','')橙色=int(橙色.替换('gm','')打印(香蕉)打印(橙色)总重量=(香蕉+(橙色/1000))打印(总重量)
>>> get_num('dfgd 45.678fjfjf')
45.678