【问题标题】:How to write regex to capture specific number formats and exclude the rest?如何编写正则表达式来捕获特定的数字格式并排除其余的?
【发布时间】:2020-07-13 14:02:15
【问题描述】:

我试图从一个字符串中捕获有限的真实案例,其中包含 Python 正则表达式中的许多其他无效数字案例。真正的情况是有效的有效数字格式,带有逗号或带有逗号和小数的数字。其他一切都是无效的。示例如下。

示例输入字符串:

input = "The net value is 1,000,000.00 however even 100,000 or 1,000,000 is acceptable. The amounts that are not acceptable are 1 000,000.00 or 1.000.000.00 or 1,000,000,00 or 1,000,000,0000"

输出为:1,000,000.00 100,000 1,000,000

我尝试的当前python正则表达式如下:

\d{1,3}(,{1}\d{3})*(\.{1}\d+){0,1}$

这仅在输入只是数字时有效。当我尝试输入带有单词的数字时,它失败了。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    下面的正则表达式模式更接近你想要的:

    (?<!\S)[1-9]\d{0,2}(?:,\d{3})*(?:\.\d+)?(?!\S)
    

    这使用环视来断言数字的边界必须是空格或输入的开始/结束。另请注意,我们坚持每个有效数字以零开头。

    我会使用re.findall,如下所示:

    inp = "The net value is 1,000,000.00 however even 100,000 or 1,000,000 is acceptable. The amounts that are not acceptable are 1 000,000.00 or 1.000.000.00 or 1,000,000,00 or 1,000,000,0000"
    matches = re.findall(r'(?<!\S)[1-9]\d{0,2}(?:,\d{3})*(?:\.\d+)?(?!\S)', inp)
    print(matches)
    

    打印出来:

    ['1,000,000.00', '100,000', '1,000,000', '1']
    

    作为上面为什么出现1的注释,没有明显的方法可以知道独立数字1实际上是破百万数字的一部分。

    【讨论】:

    • 请注意,在这种情况下,您实际上可以排除独立数字。 OP:“真正的案例是有效的有效数字格式,带有逗号或带有逗号和小数的数字。其他一切都是无效的。”。这对我来说是 至少 逗号。因此将 * 量词更改为 + 就可以了 =)
    • @JvdV 从来没有想过这个,好建议+1。
    【解决方案2】:

    另一种选择是使用负前瞻来排除第一个逗号之前只有零的情况,并在值之后至少匹配一个逗号,因为您想要的输出是1,000,000.00 100,000 1,000,000

    (?<!\S)(?!0+\,)\d{1,3}(?:,\d{3})+(?:\.\d+)?(?!\S)
    

    解释

    • (?&lt;!\S) 向左声明空白边界
    • (?!0+\,) 不仅在第一个逗号前断言零
    • \d{1,3} 匹配 1-3 位数字
    • (?:,\d{3})+ 重复 1+ 次匹配逗号和 1-3 位数字
    • (?:\.\d+)? 可以选择匹配一个点和 1 个以上的数字
    • (?!\S) 在右侧断言空白边界

    Regex demo | Python demo

    例子

    import re
     
    input = "The net value is 1,000,000.00 however even 100,000 or 1,000,000 is acceptable. The amounts that are not acceptable are 1 000,000.00 or 1.000.000.00 or 1,000,000,00 or 1,000,000,0000"
    regex = r"(?<!\S)(?!0+\,)\d{1,3}(?:,\d{3})+(?:\.\d+)?(?!\S)"
     
    print(re.findall(regex, input))
    

    输出

    ['1,000,000.00', '100,000', '1,000,000']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2018-11-20
      • 2020-02-10
      • 2019-10-08
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多