我试图从以下句子中提取数据:
"monthly payment of 525 and 5000 drive off"
使用python正则表达式搜索功能:re.search()
我的正则表达式查询字符串如下所示:
match1 = "(?P<down_payment>\d+)\s*(|\$|dollars*|money)*\s*" + \
"(down|drive(\s|-)*off|due\s*at\s*signing|drive\s*-*\s*off)*"
我的问题是它与错误的数值匹配作为预付款,它得到525和5000.
我如何改进我的正则表达式字符串,以便它只匹配一个元素,如果另一个元素也成功匹配?
在这种情况下,例如, 5000 和驱车关闭都匹配,因此我们可以提取5000作为down_payment,但525与任何预付款值不匹配,所以它甚至不应该考虑525。
答案 0 :(得分:2)
重点是你要匹配模式序列。为了确保考虑尾随模式,它们不能全部是可选的。看,\s*
,(|\$|dollars*|money)*
,\s*
,(down|drive(\s|-)*off|due\s*at\s*signing|drive\s*-*\s*off)*
可以匹配空字符串。
我建议删除最终的*
量词,以匹配模式的恰好一次出现:
(?P<down_payment>\d+)\s*(?:\$|dollars*|money)?\s*(down|drive[\s-]*off|due\s*at\s*signing|drive\s*-*\s*off)
请参阅regex demo
另请注意,我将一个(\s|-)
群体归入角色类[\s-]
,因为您只替换单个字符模式,并将(|\$|dollars*|money)*
变为非 - 捕获仅与(?:\$|dollars*|money)?
,$
或dollar(s)
的1或0次匹配的可选组money
。