正则表达式:根据非捕获组排除结果?

时间:2016-04-23 02:08:06

标签: python regex string validation

所以我尝试使用以下正则表达式来匹配有效价格的模式

^\$[1-9]\d{0,2}(?:\,\d{3})?(?:\.\d{2})?

(源自SO上的另一个问题)

匹配的约束是:

  1. $1.00 <= price <= $999,999.99
  2. 不需要小数位($1有效$1.00
  3. 小数位后的单位数字无效($1.1$2.9等。)
  4. 小数点后3位数无效($1.111$2.999等。)
  5. 上述模式可以处理前两个约束而不是其他约束。问题是,在(3)(4)的情况下,匹配小数点之前的价格部分。

    例如:

     $100,000.4 matches to $100,000
     $200,000.444 matches to $200,000.44
    

    如何修改此项,以便在(3)(4)的情况下,整个字符串不匹配?

2 个答案:

答案 0 :(得分:3)

轻松!只需在最后添加([^,.\d$]|$),以便正则表达式解析器工作,直到最接近的数字,逗号,点或美元。或者它已经在字符串的末尾。

^\$[1-9]\d{0,2}(?:\,\d{3})?(?:\.\d{2})?([^,.\d$]|$)

Demo

答案 1 :(得分:2)

您可以使用否定前瞻(?![\d.,])断言匹配价格后面没有数字,逗号或点:

\$[1-9]\d{0,2}(?:,\d{3})?(?:\.\d{2})?(?![\d.,])

Regex 101 demo.