Гибкий анализ числовых строк в Python - PullRequest
7 голосов
/ 07 декабря 2009

Существуют ли какие-либо библиотеки Python, которые помогают анализировать и проверять числовые строки помимо того, что поддерживается встроенной функцией float ()? Например, в дополнение к простым числам (1234.56) и научным обозначениям (3.2e15) я хотел бы иметь возможность анализировать форматы, такие как:

  • Числа с запятыми: 2 147 483 647
  • Названы большие цифры: 5,5 млрд.
  • Фракции: 1/4

Я немного искал и ничего не смог найти, хотя был бы удивлен, если бы такой библиотеки еще не было.

Ответы [ 4 ]

6 голосов
/ 07 декабря 2009

Если вы хотите преобразовать «локализованные» числа, такие как американская форма «2 147 483 647», вы можете использовать функцию atof() из модуля locale . Пример:

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 голос
/ 07 декабря 2009

Это должно быть довольно просто построить в pyparsing - на самом деле, один из обучающих проектов pyparsing делает кое-что из этого (wordsToNum.py на на этой странице ) уже кое-что делает. Вы говорите о вещах, которые на самом деле не имеют стандартного представления (стандартного в смысле ISO 8602, а не стандартного в смысле «того, что все знают»), поэтому легко может оказаться, что никто не сделал именно то, что вы ищете для.

0 голосов
/ 07 декабря 2009

babel поддерживает первый случай (числа i18n с запятыми). Документы: http://babel.edgewall.org/wiki/ApiDocs/babel.numbers.

Поддержка простых именованных чисел не должна быть слишком сложной для самостоятельного кодирования, как и для дробей.

0 голосов
/ 07 декабря 2009

Я не слышал ни об одном. Знаете ли вы о какой-либо такой библиотеке для каких-либо других языков? Таким образом, вы можете использовать их документацию и тесты.

Если вы не можете его найти, напишите несколько тестовых примеров, и мы поможем вам заполнить код синтаксического анализа.

У Google должен быть один, попробуйте поискать 5,5 миллиардов * 10, но я не думаю, что они открыли что-то подобное. В зависимости от того, как вам это нужно, вы можете использовать Google для выполнения некоторых работ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...