2016-07-01 149 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

相关问题