我有一行文字,如下所示,我想提取其中的金额,
您的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
),请考虑使第一位数字捕获为“一个或多个”(+
),而不是“零或多个”(*
)。