我有一行文字如下所示,我想提取其中的金额,
您的账单为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
我似乎不明白为什么不捕捉全部金额。我认为必须对正则表达式的贪婪方面做些什么。任何建议都会有很大的帮助。
答案 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)
演示
答案 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'
。