2012-01-12 235 views
3

我改寫(munging)包含以下形式的字符串數據:Python的正則表達式(提取從字符串貨幣價值)

" The little £250,000 brown fox jumped over the lazy dog" 

[澄清]

該字符串被轉換爲一個雙五月已經被「清洗」已經和可能只是看起來像這樣:

"£250,000" 

我設法破解一起粗功能,即地強迫一個STR像「250,000英鎊」成雙倍。然而,當我用一個像上面那樣的字符串來呈現字符串的貨幣部分時,我正努力寫一個正則表達式。問題是我不知道我會遇到哪種類型的字符串 - 即「清理」的貨幣值(如第二個示例)或「髒」字符串(如第一個示例)。我需要編寫一個函數來處理這兩種類型的字符串,並以double形式返回貨幣字符串。

對於'骯髒'的字符串,有人可以推薦如何模式匹配的貨幣值(預期最低:1英鎊,預計最高£99,999,999)。另外,如果下面的函數有更多的pythonic方法,我想聽一聽Pythonistas的建議。

non_numeric = re.compile(r'[^0-9\.]+') 

    def string_to_decimal(s): 
     try: 
      s= s.decode('ascii') 
     except: 
      s = s[1:] # Assumption is that s begings with currency symbol 

     s = str(s) # Probably superfulous? 

     s = s.replace(',','') 
     s = non_numeric.sub('', str(s)) 
     return decimal.Decimal(s) 
+0

's = str(s)'在'try'之前會有意義。由於解碼僅適用於字符串,並且索引對整數不起作用,所以您可以假設它是'try/except'之後的字符串。否則,你的程序會在'except'內部拋出異常(不會被捕獲)。 – FakeRainBrigand 2012-01-12 13:11:15

回答

1

嘗試:

re.findall('£{1}[,0-9]{1,10}','The little £250,000 brown fox jumped over the lazy dog') 

然後把比賽的結果並刪除逗號。

+0

+1:我在你的完整解決方案中也使用了你的regex表達式來匹配'dirty'字符串 – 2012-01-12 14:46:46

2
r'£\d{1,3}(?:\,\d{3})+(?:\.\d{2})?' 

將匹配貨幣表達式,例如

>>> re.findall(r'£\d{1,3}(?:\,\d{3})+(?:\.\d{2})?', 
... " The little £250,000 brown fox jumped over the lazy dog") 
['\xc2\xa3250,000'] 

可以將得到的值轉換爲Decimal

>>> Decimal('\xc2\xa3250,000'.decode('utf-8')[1:].strip(',')) 
Decimal('250000') 

(假設UTF-8。)

+0

我收到以下錯誤(使用上面的代碼片段時):SyntaxError:第140行文件/path/to/myscript.py中的非ASCII字符'\ xc2',但未聲明編碼;有關詳細信息,請參閱http://www.python.org/peps/pep-0263.html。我會檢查URL的詳細信息 – 2012-01-12 13:17:06

+0

@HomunculusReticulli:把'# - * - coding:utf-8 - * - '放在文件的頂部。這告訴Python解釋器關於源文件的編碼。 – 2012-01-12 13:18:09

+0

謝謝修復那個錯誤。但是,我需要澄清的是,我需要能夠匹配像'£250,000'這樣的字符串(沒有其他文字圍繞monetray值)。 – 2012-01-12 13:25:41

0

如果輸入文本可以使用各種語言,則需要擔心不同語言環境的標點差異。

在某些地區,您稱之爲「250,000英鎊」將會是「250.000英鎊」,反之亦然:「0.50英鎊」可以寫成「£0.50」。有可能更多的品種。

忽略這一點,我想你應該用正則表達式來處理你的例子,比如r"£[0-9,.]+"