使用Python中的正则表达式提取特定值

时间:2015-05-05 10:22:03

标签: python regex

我有一行文字如下所示,我想提取其中的金额,

  

您的账单为17.99美元,将于09-01-2002发布

在将上面的行视为String后,我已经编写了如下的正则表达式,

s = 'Your bill of USD 17.99 is due on 09-01-2002'

match = re.search( r'bill of.*([0-9]*\.[0-9]{2})', s.lower() )
if match: 
    print match.group(1)

打印,

  

0.99

但我希望它能打印 17.99

我似乎不明白为什么不捕捉全部金额。我认为必须对正则表达式的贪婪方面做些什么。任何建议都会有很大的帮助。

5 个答案:

答案 0 :(得分:5)

您的问题是*表示零或更多.包含数字,而捕获是贪婪(即较早的表达式{ {1}}正在“窃取”所有数字)。请参阅此演示:https://regex101.com/r/vN5vJ5/1

相反,在数字开头之前使其匹配所有非数字(并使用.*而不是\d来表示数字中的数字):

[0-9]

更新了演示:https://regex101.com/r/vN5vJ5/4

如果您的格式不允许,例如>>> import re >>> s = 'Your bill of USD 17.99 is due on 09-01-2002' >>> re.findall(r'bill of\D*(\d*\.\d{2})', s) ['17.99'] (而不是USD .99),请考虑将第一个数字捕获“一个或多个”USD 0.99)而不是“零或更多” +)。

答案 1 :(得分:0)

由于*匹配[0-9]零次或多次,前面的.*会吃掉17.你可以使用这个:

match = re.search( r'bill of.*?([0-9]*\.[0-9]{2})', s.lower() )

.*?中的问号使其不贪婪。并且您可以在字符类之后添加+以至少需要一次点击。

答案 2 :(得分:0)

你的正则表达式是贪婪的.*,试试这个

import re
s = 'Your bill of USD 17.99 is due on 09-01-2002'

match = re.search( r"bill.*?([\d]+\.[\d]{2})", s.lower() )
if match: 
    print match.group(1)

演示

http://ideone.com/66mF8w

答案 3 :(得分:0)

你只需要使用

match = re.search( r"[a-zA-Z\ ]+([0-9\.]+)\ .*", s.lower() )

答案 4 :(得分:0)

尝试使用:

'bill of [\D]*([0-9]*\.[0-9]{2})'

.*之后的'of'也会抓住'17'