2009-12-07 29 views
7

是否有任何Python庫可幫助解析和驗證超出內置float()函數支持的數字字符串?例如,除了簡單的數字(1234.56)和科學記數法(3.2e15),我希望能夠解析格式,如:Python中靈活的數字字符串解析

  • 編號之間用逗號:2,147,483,647
  • 命名大數5.5十億
  • 分數:1/4

我做了一些搜索和找不到任何東西,但如果這樣的庫確實不存在我會感到很驚訝。

+1

這是一個有點偏題: 前兩點受到國際和語法分析模糊不清:在歐洲「,」代表分數和億美元不一樣,美國億美元。 但是我認爲,如果輸入是結構化的,它們很容易實現。 最後一點受到浮點四捨五入的影響。您可以使用sympy類來存儲小數值,或者您可以推出自己的類。如果您不需要擁有許多操作/操作符,則可能更容易製作自己的類。 – Anycorn 2009-12-07 06:31:48

回答

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 

因此,你可以解析用任何你提到的第3種方式的數字,僅上述兩個標準模塊的幫助:

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.   
0

我還沒有聽說過一個。你知道任何其他語言的這樣的圖書館嗎?這樣你可以利用他們的文檔和測試。

如果你找不到一個,寫一堆測試用例,那麼我們可以幫你填寫解析代碼。

谷歌必須有一個,嘗試搜索55億* 10,但我不認爲他們已經開源此類。取決於你需要如何使用它,你可能可以使用谷歌做一些工作;)

1

在pyparsing中構建一個應該是非常簡單的 - 事實上,其中一個教程pyparsing項目做了一些這個(wordsToNum.pythis page)已經做了一些。你在談論的東西實際上並沒有標準的表示(ISO 8602標準,而不是「每個人都知道的」意義上的標準),所以很容易就沒有人按照你想要的來做對於。