Python - ValueError:使用正则表达式模块将字符串转换为浮点数



我正在运行以下代码:

import re
def extract_numbers(text):
return [float(r.replace(',', '')) for r in re.findall(r'[d,]+', text)]

这适用于所有示例,除了以下示例:

text = 'kjadhf asdf kjsadhf, alsdhf lksajdhf. lsad fjshdalf kjhsad f.'

我得到错误:

ValueError: could not convert string to float:

我已经重组了代码,所以它适用于其他文本样本与数字(text = '102 smse s'),但不工作与样本中没有数字。

对于这个问题的任何建议都将非常感谢!

正则表达式匹配数字和逗号,因此在字符串中:

kjadhf asdf kjsadhf, alsdhf lksajdhf. lsad fjshdalf kjhsad f.

它匹配,,然后将其转换为空字符串,该空字符串不能转换为浮点数。

有很多解决方案,但一个可能的解决方案是从寻找一个数字开始,然后保留其后面的任何字符,即数字或逗号。这样它将匹配42,1,000,000等,但不匹配,

可以这样实现:

import re
def extract_numbers(text):
return [float(r.replace(',', '')) for r in re.findall(r'd[d,]*', text)]
print(extract_numbers("12Hello42World97"))
print(extract_numbers("HelloWorld1,234"))
print(extract_numbers(" 78 HelloWorld 32,852"))
print(extract_numbers("HelloWorld"))
print(extract_numbers("kjadhf asdf kjsadhf, alsdhf lksajdhf. lsad fjshdalf kjhsad f."))

输出:

[12.0, 42.0, 97.0]
[1234.0]
[78.0, 32852.0]
[]
[]

另一种解决方案是从原始字符串中删除逗号,然后只需要查找数字:

import re
def extract_numbers(text):
return [float(r) for r in re.findall(r'd+', text.replace(',', ''))]

当您尝试创建一个不包含数字的浮点数时将引发此异常。从你的问题说,它似乎是你的方法工作时,一个字符串传入,其中包含一个数值。

注意不工作的字符串不包含0-9的数字:

text = 'kjadhf asdf kjsadhf, alsdhf lksajdhf. lsad fjshdalf kjhsad f.'

因为它不包含数字,所以引发这个异常。你可以用几种不同的方式来改变你的方法,这取决于你想要它做什么。

版本1:当传入的字符串不包含任何数字时返回none

import re
def extract_numbers(text):
try:
return [float(r.replace(',', '')) for r in re.findall(r'[d,]+', text)]
except ValueError:
return None

版本2:当字符串

中没有数字时返回-1(或您希望的任何数字值)
import re
def extract_numbers(text):
try:
return [float(r.replace(',', '')) for r in re.findall(r'[d,]+', text)]
except ValueError:
return -1

版本3:不返回任何东西

import re
def extract_numbers(text):
try:
return [float(r.replace(',', '')) for r in re.findall(r'[d,]+', text)]
except ValueError:
pass

这实际上取决于你想对返回的值做什么。这些方法都可以。

你应该尝试一下小技巧,比如添加"0"在将字符串转换为浮点数之前。这样,字符串将至少包含一个数字(这会改变期望的结果),并且不允许float函数失败。

试试下面的代码:

import re
def extract_numbers(text):
return [float("0" + r.replace(',', '')) for r in re.findall(r'[d,]+', text)]
text = "kjadhf asdf kjsadhf, alsdhf lksajdhf. lsad fjshdalf kjhsad f."
print(extract_numbers(text))
>>> output :
[0.0]

您的正则表达式匹配逗号,,即使它旁边没有数字

你可以试试这个

import re
def extract_numbers(text):
return [float(r.replace(',', '')) for r in re.findall(r'd+[,d]*', text)]

print(extract_numbers('kjadhf asdf kjsadhf, alsdhf 40,152lksajdhf. lsad fjshdalf kjhsad f.'))
print(extract_numbers('kjadhf asdf kjsadhf, alsdhf lksajdhf. lsad fjshdalf kjhsad f.'))
print(extract_numbers('205,152,200'))
print(extract_numbers(''))
print(extract_numbers('hi there9'))
[40152.0]
[]
[205152200.0]
[]
[9.0]

最新更新