Python正则表达式匹配货币有或没有逗号或小数

时间:2016-07-01 11:04:54

标签: python regex

如何编写可1.匹配货币的正则表达式,该货币可能包含或不包含逗号或小数,2.仅与货币代码匹配。我看到的主要是匹配货币符号。 我希望能够从一个完整的文本中匹配货币['300,000.00']和货币代码['USD'],如下所示:

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'] 

3 个答案:

答案 0 :(得分:1)

'\d+([.,]?\d*)*'应该符合所有情况。 如果需要,还可以添加空间。像这样:

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

对于货币代码:'[A-Z]{3}'应该有效。

P.S。根据SilentMonk对非捕获组的建议:

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

答案 1 :(得分:1)

获取货币:

拥有详尽的有效货币清单可能不太可行,但如果货币数量有限,那么您可以这样做:

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

(?=) - 积极前瞻 (?<=) - 积极向后看

答案 2 :(得分:0)

要仅匹配货币,您可以使用:(\d[0-9,.]+)

并匹配您可以使用的货币代码:([A-Z]+)

Demo and Explaination