从python字符串中以简单的方式提取数字[重复]

Posted

技术标签:

【中文标题】从python字符串中以简单的方式提取数字[重复]【英文标题】:extract digits in a simple way from a python string [duplicate] 【发布时间】:2012-05-09 01:30:55 【问题描述】:

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

x= '$120'
y = ' 90 Degrees F'
banana = '200 kgm'
orange = '300 gm'
total_weight = banana + orange/1000 

例如我想添加权重

total_weight  = 200 + 300/1000

谢谢!

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

【问题讨论】:

我建议你看看 re 模块。正则表达式用于从语料库中提取结构化数据。 您自己的示例显示了此处的问题。香蕉在kgm,橙色在gm,这当然意味着权重是200000300,而不是200300,这增加了问题的复杂性。这对你有影响吗?。 出于这个原因,他将 orange 除以 1000 @jamylak 没错,这是固定的吗?还是那可能会改变? 我认为这不是问题的一部分,因为它是硬编码的。 【参考方案1】:

从字符串中提取数字的最简单方法是使用正则表达式和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]

【讨论】:

这对浮点数有用吗?我对 python 世界很陌生,我不知道 d+ 代表什么。谢谢你的帮助:) 您可以阅读不同的正则表达式here,但'\d+' 表示一位或多位数字(+ 表示一位或多位)。 @KaRa 'd' 代表“任意十进制数字”,“+”代表“匹配 1 次或多次重复”。更多详情请查看docs.python.org/2/library/re.html @KaRa 你应该了解正则表达式。如import re re.findall("[a-z]", "abcccd ff")一一获取字符串"abcccd ff"中的所有小写字母(a-z) 另一种方法!!!但前提是你的字符串中有一个数字!将是 int(filter(str.isdigit, '90 Degrees F')) 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【参考方案2】:

不使用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

【讨论】:

太棒了!无论如何要编辑它以使其也适用于浮动?改正return语句为float是否正确? 如果有多个数字,这将不起作用【参考方案3】:

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

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') 这样访问命名组。

我认为这应该可以帮助您入门。

【讨论】:

这不处理科学记数法或许多其他有趣的浮点值(例如 nan、inf) 香蕉 = '200 kgm' 橙色 = '300 gm' 香蕉 = int(banana.replace('kgm', ' ')) 橙色 = int (orange.replace('gm', ' ' )) 打印 (香蕉) 打印 (橙色) 总重量 = (香蕉 + (橙色/1000 )) 打印 (总重量)【参考方案4】:
>>> x='$120'
>>> import string
>>> a=string.maketrans('','')
>>> ch=a.translate(a, string.digits)
>>> int(x.translate(a, ch))
120

【讨论】:

这个不行……你自己试试 @jaymylak 感谢您的指点。修正【参考方案5】:

如果您正在对数字进行某种数学运算,您可能还想知道单位。鉴于您的输入限制(输入字符串仅包含单位和值),这应该正确返回两者(您只需要弄清楚如何将单位转换为您的数学常用单位)。

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)

【讨论】:

以上是关于从python字符串中以简单的方式提取数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从python中所有列的字符串中提取数字

python从含有汉字和数字的字符串中提取数字部分

从没有任何空格的字符串中提取数字[重复]

如何从 Python 中的字符串中提取数字?

python常见面试题讲解提取不重复的整数

python常见面试题讲解提取不重复的整数