2014-12-05 97 views
0

我想使用正則表達式從文本中獲取價格。正則表達式,得到價格。但小數點或逗號爲

小示例: 「今天這款優質產品僅售1.000,59歐元!」

我想從上面的文本中獲得價格。這是我的Python正則表達式到目前爲止:

re.findall(ur'([0-9,.]*)', text) 

這只是一個小問題。一些文本使用逗號(,)分割小數,其他文本使用點(。),其中一些文本甚至沒有小數,或者用短劃線( - )替換00小數,例如59歐元, -

理想情況下,讓所有的價格沒有任何問題將是(在我看來):

  • 如果選中的數字從右到左,是第三個字符點或逗號(導致每一個價格不包含多於2位小數)?
  • 它是否包含破折號(如€50, - )?

如果兩個都是NO:刪除所有的點和逗號。 如果兩個問題中的一個是YES:如果小數點用點(。)分隔,用逗號替換該點,或者它已經是逗號,就這樣放置。並刪除其餘的逗號和點。

這是可能的正則表達式?

+0

單個ex是不夠的。提供更多的預期產出。 – 2014-12-05 09:28:26

+0

尋找貨幣符號如何?另外,你有沒有試過Google的「正則表達式」和「貨幣」? – 2014-12-05 09:40:16

+0

@AvinashRaj,你可能可以幫忙解決這個問題嗎?有額外的分裂功能或什麼?真正用哪種語言無關緊要。我可以將其翻譯爲:P – 2014-12-05 09:43:20

回答

1

編輯:

對不起,我沒有仔細閱讀問題描述。我認爲要解決這個問題,你需要兩個正則表達式模式。首先做一個re.sub()然後re.findall()

pattern = re.compile(r'(([.,]{1})(\d{1,3}|-))') 
s = "2,456,777.00 xxxxxxxxxxxxx 59,789,- xxxxxxxxxxxx 59,- xxxxxxxxxx 1.000,59" 

def subs(m): 
    g0 = m.group(0) 
    g3 = m.group(3) 

    if g3 == '-': 
     g3 = '00' 
    if len(g0) == 4: 
     return ',' + g0[1:4] 
    else: 
     return '.' + g3 

c = re.findall(r'[\d.,-]+', re.sub(pattern, subs, s)) 
print c 

>> ['2,456,777.00', '59,789.00', '59.00', '1,000.59'] 

有些麻煩確實如此。希望有人能想出一個更聰明的。

+0

我不得不說,迄今爲止工作非常好。猜猜我必須添加用於替換小數點分隔符,破折號等功能嗎?:) – 2014-12-05 09:49:37

+0

替換小數點分隔符?你能讓它更清楚一點嗎? – 2014-12-05 09:56:51

+0

這是迄今爲止的主要問題。我們必須將正確的十進制格式提供給postgres(2456777或2456777.00)。 '''([0-9 ,.] *)''在第一種情況下工作得很好,但因爲我們用點代替了逗號(1.000,59變成了1.000.59),所以postgres實際上保​​存了1.00。在我的第一篇文章中看到我的「理想」情況。 – 2014-12-05 09:58:21