在Python中使用正则表达式提取特定值 - python

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

您的USD 17.99帐单将于2002年9月1日到期

在将上一行视为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)

它打印,

.99

但我希望它打印17.99

我只是似乎不明白为什么不全额支付。我认为它必须在正则表达式的贪婪方面做些事情。任何建议都会有很大帮助。

python大神给出的解决方案

您的问题是*表示零个或多个,.包含数字,并且捕获是贪婪的(即,较早的表达式.*正在“窃取”所有数字)。观看此演示:https://regex101.com/r/vN5vJ5/1

而是使其与数字开头之前的所有非数字匹配(并对数字内的数字使用\d而不是[0-9]):

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

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

如果您的格式不允许,例如USD .99(而不是USD 0.99),请考虑使第一位数字捕获为“一个或多个”(+),而不是“零或多个”(*)。