从包含多个数字的字符串中提取数字百分比

时间:2020-04-30 08:41:25

标签: python regex string

我想在字符串中提取数字百分比。这是一些情况:

  • 输入:“银行ABC 123%CDE”->输出:123.00(作为浮动货币)
  • 输入:“一些随机银行IPCA + 12,34%”->输出:12.34
  • 输入:“ Bank1 2,3%”->输出:2.3

逗号仅用作分隔符,每个字符串只有一个百分比,因此以下字符串将永远不会出现:

  • 无效输入:“银行ABC,123%”
  • 无效输入:“银行ABC 123%和12,34%”

当前,我在Python中使用以下脚本

def extract_percentage(x: str) -> float:
   float((re.sub(r'[^\d,]', '', x)).replace(',','.'))

它适用于上面的前两个示例,但是对于第三个示例,输出为12.3

我应该怎么做?最好使用Python。

2 个答案:

答案 0 :(得分:2)

您的正则表达式将删除空格以及其他所有内容。我认为要使用正则表达式查找内容,最好的方法是使用re库进行搜索。

我们将首先查找所有以%结尾的字符串:'.*%'。 对于Bank ABC 123% CDE,它将返回Bank ABC 123% CDE,其中包含空格和非数字。

要对此进行改进,让我们查找最多1个逗号或点的数字:\d*[,.]?\d*%,这将为您的输入返回123%

总结一下,让我们用点代替逗号

import re

str = 'Bank1 2,3%'
arr = [x.replace(',','.') for x in re.findall('\d*[,.]?\d*%',str)]
print(arr)
>>> ['2.3%']

请注意,答案是所有匹配项组成的数组

如果您想拨出电话号码,现在可以执行以下操作:

if len(arr)>0:
  number_without_percent_sign = arr[0][:-1]
  print(float(number_without_percent_sign))
>>> 2.3

答案 1 :(得分:0)

受到上述Shahar Bental的回答的启发,我得到了另一个解决方案,该解决方案较少依赖正则表达式,并使用python的split方法。不确定是否更好。

我在以前的脚本中添加了以下内容:

words = x.split(' ')
for word in words:
  if '%' in word:
    return float((re.sub(r'[^\d,]', '', word)).replace(',','.'))
相关问题