只有找到多个模式时才使用正则表达式匹配(python)

时间:2017-01-04 07:22:57

标签: python regex

我试图从以下句子中提取数据:

"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。

Clearer explanation here

1 个答案:

答案 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