Python - ValueError: convert string to float with Regular expression module

Python - ValueError: convert string to float with Regular expression module

我是运行以下代码:

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.

匹配,,然后转换为空字符串,无法转换为float。

对此有很多解决方案,但一个可能的解决方案是从查找数字开始,然后保留该数字或逗号之后的所有字符。这样它会匹配 421,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: return 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:当字符串中没有数字时,return -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:不要 return 任何东西。

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

这实际上取决于您要对 returned 值做什么。这些方法中的任何一种都应该有效。

您应该尝试一些小技巧,例如在将字符串转换为浮点数之前添加一个“0”字符串。这样,该字符串将至少包含一位数字(这将更改所需的结果)并且不会允许浮动函数失败。

也许试试这个代码:

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]