Python中灵活的数字字符串解析

时间:2009-12-07 06:06:51

标签: python validation parsing numbers

是否有任何Python库可以帮助解析和验证数字字符串超出内置float()函数支持的范围?例如,除了简单数字(1234.56)和科学记数法(3.2e15)之外,我希望能够解析如下格式:

  • 逗号:2,147,483,647
  • 命名为大数:55亿
  • 分数:1/4

我做了一些搜索但找不到任何东西,但如果这样的图书库还不存在我会感到惊讶。

4 个答案:

答案 0 :(得分:6)

如果要转换“本地化”数字,例如美国“2,147,483,647”表单,可以使用locale模块中的atof()函数。例如:

import locale
locale.setlocale(locale.LC_NUMERIC, 'en_US')
print locale.atof('1,234,456.23')  # Prints 1234456.23

对于分数,Python现在直接处理它们(从2.6版开始);它们甚至可以用字符串构建:

from fractions import Fraction
x = Fraction('1/4')
print float(x)  # 0.25

因此,只有借助上述两个标准模块,您才能解析前面提到的任何一种方式编写的数字:

try:
    num = float(num_str)
except ValueError:
    try:
        num = locale.atof(num_str)
    except ValueError:
        try:
            num = float(Fraction(num_str))
        except ValueError:
            raise Exception("Cannot parse '%s'" % num_str)  # Or handle '42 billion' here
# 'num' has the numerical value of 'num_str', here.        

答案 1 :(得分:1)

在pyparsing中构建一个应该非常简单 - 事实上,其中一个教程pyparsing项目中的一些(this page上的wordsToNum.py)已经完成了一些。你说的是那些没有真正标准化表达的东西(ISO 8602意义上的标准,而不是“每个人都知道的”标准),所以很容易就是没有人完成你正在寻找的东西对

答案 2 :(得分:0)

我没有听说过一个。你知道任何其他语言的图书馆吗?这样你就可以利用他们的文档和测试。

如果你找不到一个,写一堆测试用例,那么我们可以帮你填写解析代码。

Google必须拥有一个,尝试搜索55亿* 10,但我认为他们没有开源这样的东西。根据您的使用方式,您可以使用Google进行一些工作;)

答案 3 :(得分:0)

babel支持第一种情况(带逗号的i18n号码)。文件:http://babel.edgewall.org/wiki/ApiDocs/babel.numbers

支持简单的命名数字不应该太难以自己编码,与分数相同。