2016-07-01 152 views
1

如何編寫正則表達式可以1.匹配可能包含或不包含逗號或小數的貨幣,2.僅匹配貨幣代碼。我看到的大多是匹配的貨幣符號。 我希望能夠從一個完整的文本相匹配的貨幣['300,000.00']和貨幣代碼['USD']像這樣:Python正則表達式匹配有或沒有逗號或小數的貨幣

Userid 9XXXX219 sales USD300,000.00 On 01-JUL-2016 08:34:32

到目前爲止,我試過,但它僅與十進制的,而不是那些沒有小數點匹配或有逗號的人:

s = 'USD1 USD1.00 USD100.00 USD1,000 CAD1,000.00' 
re.findall(r'\d+\.\d+', s) 
#matches 
['1.00', '100.00', '000.00'] 

#should not match any other thing e.g. 1XXXX324 

#instead of this: 
['1','1.00', '100.00', '1,000', '1,000.00'] 

如何編寫另一個正則表達式模式來匹配僅貨幣代碼?即

['USD', 'USD', 'USD', 'USD','CAD'] 
+0

're.compile(「(\ d +(? :[\。,] \ d +)?)')'工作 - 檢查出來! – wolframalpha

+0

@wolframalpha匹配有或沒有小數,但不匹配逗號,如'1,000.00' – DougKruger

+0

're.compile('(\ d +(?:[\。,] \ d +)*)')'如果您想要多個逗號和十進制點! – wolframalpha

回答

1

獲取貨幣:

Ha詠有效匯率的詳盡清單可能不是可行的,但如果它是貨幣的數量有限,那麼你可以做的是這樣的:

re.findall('USD|CAD','USD1 USD1.00 USD100.00 USD1,000 CAD1,000.00 123XXX123') 

輸出:

['USD', 'USD', 'USD', 'USD', 'CAD']

獲取金額:

使用捕獲組,re.findall返回元組中的每個捕獲。使用非捕獲組(?:)將解決該問題。

re.findall('(?<=USD|CAD)\d{1,3}(?:,\d{3})*(?:\.\d+)?(?=\s)','Userid 9XXXX219 sales USD300,000.00 On 01-JUL-2016 08:34:32') 

輸出:

['300,000.00']

插圖與示例文本:

re.findall('(?<=USD|CAD)\d{1,3}(?:,\d{3})*(?:\.\d+)?(?=\s)','USD1 USD1.00 USD100.00 USD1,000 CAD1,000.00 123XXX123') 

輸出:

['1', '1.00', '100.00', '1,000', '1,000.00']

閱讀下列here

(?=) - 正向前查找 (?<=) - 正回顧後

+0

謝謝,但不是將兩種模式結合在一起,是否可以將它們分成兩種不同的模式,一種匹配貨幣代碼,另一種匹配貨幣。我注意到沒有'(?:USD | CAD)'它匹配'1XXXX324'爲'['1','324']' – DougKruger

+0

@KrugerBr,是的。這可以做到。正如你所嘗試的,分割正則表達式。你能編輯問題併發布你想要得到這些結果的實際文本嗎?因爲找到滿足所有條件的理想正則表達式太複雜。 – SilentMonk

+0

@KrugerBr,我編輯了我的答案。 – SilentMonk

1

'\d+([.,]?\d*)*'應該匹配所有情況。 如果你願意,你也可以添加空間。像這樣:

'\d+([., ]?\d*)*' 

對於貨幣代碼:'[A-Z]{3}'應該工作。

P.S.按照SilentMonk建議對非捕獲組:

(?:[A-Z]{3})(?:\d+(?:[.,]?\d*)*) 
+0

不錯的。但不會(USD | CAD .... 。)是一個更好的貨幣正則表達式,因爲'ABC123'也會在這裏匹配嗎? – SilentMonk

+1

只有當你確定OP只需要這兩種貨幣時,考慮到全球貨幣列表,並且它可能每天都在增長,如果明天有一個有效的貨幣ABC,那麼不要感到驚訝 –

+0

是的,讓我們來看看OP的要求 – SilentMonk

0

爲了配合貨幣不僅可以使用:(\d[0-9,.]+)

,並以符合貨幣代碼,你可以使用:([A-Z]+)

Demo and Explaination

相關問題