1

我正在尝试编写一个正则表达式来搜索 1000.00 美元或更多的美元金额,并且前面有一个 - 。$ 也应该是可选的。

这是我到目前为止所拥有的,它没有按我预期的那样工作:(

\-\$?(((\d{1,3},)+\d{3})|\d+)\.\d{2}

但是当这个值应该被忽略时,它在一个值 -$73.75 上被触发。任何指针/想法将不胜感激:)

4

3 回答 3

4

您可以简单地检查之前的值是否.至少为 4 位:

-\$?\d{4,}\.\d{2}

请注意,您不需要转义-,它不是正则表达式中的元字符(在字符类之外)。

-        # Match a hyphen
\$?      # An optional $ sign
\d{4,}   # 4 or more digits
\.       # A dot
\d{2}    # 2 digits after dot

如果,您的数字中可以有分隔符 ( ),那么您可以使用以下命令:

-\$?[\d,]*\d,\d{3}\.\d{2}

这将确保一个数字后跟逗号和 3 个数字。在此之前,它在允许任意数量的数字和逗号方面非常宽松。

这当然不是一个非常严格的正则表达式。但同样,创建一个将是困难的。您最好避免使用正则表达式来根据本地化、格式和一些最低金额来验证金额。

于 2013-09-11T06:37:42.100 回答
3

不使用正则表达式怎么样:-

>>> abs(float('-$1000'.translate(None, '$,'))) >= 1000
True
>>> abs(float('-$1,000'.translate(None, '$,'))) >= 1000
True
>>> abs(float('-$73.3'.translate(None, '$,'))) >= 1000
False
于 2013-09-11T06:46:42.043 回答
2

鉴于匹配字符串中有逗号,我假设您正在查看匹配 $1000.00 或 $1,000.00 之类的字符串。

这应该同时捕获两者,您可以在实践中看到它 rubular

(\-?\$?(?:(?:\d{1,3}(?:,+\d{3}){1,})|\d{4,})\.\d{2})

打破这个:

(                     - Capture group
  -?                  - Optional hyphen
  \$?                 - Optional dollar sign
  (?:                 - Non-capture group
    (?:               - Non-capture group
      \d{1,3}         - Between 1 and 3 digits
      (?:,+\d{3}){1,} - At least 1 comma with 3 digits, repeated
    )
    |                 - OR
    \d{4,}            - At least 4 digits
  ) 
  \.                  - a literal dot
  \d{2}               - 2 digits
)

但是,这仅适用于英式/美式货币格式。在欧洲,点是千位指示符,逗号是小数点,如下所示:$1.000.000,00. 但是,我最近回答了一个问题,该问题涉及与字符串中的货币匹配非常相似的问题

于 2013-09-11T06:39:43.593 回答