首页 > 解决方案 > 如何匹配格式为 1,234,567 的数字

问题描述

我需要帮助找到一个应该在大字符串/文本中搜索并匹配具有以下格式的数字的正则表达式规则:12,345,678 或 1,234,567 或 12,345 或 1,234。

例如:对于 12,345,678,它应该匹配 12,345,678 而不是 345,678 或 45,678 或任何类似的

我查看了:正则表达式帮助需要匹配数字 ,但答案要么匹配 1,23,456 中的 1(根本不应该,因为 1,23,456 不是数字),要么匹配 12,23,456 中的 23,456(根本不应该匹配)

在创建正则表达式规则以匹配正确的格式编号时,我首先尝试创建它不应该匹配的规则(即不是 1,23,456),然后我尝试创建它应该匹配的规则。在大多数情况下,我创建的最后一条规则匹配,但不是全部。

number_regex1 = re.compile(r'''     # should not, but matches 12,233,57 = 12,233             
                          ((\d\d(?=[\s.,]\d\d\d))((?<=\d\d)[\s.,]\d\d\d)([\s.,]\d\d\d)+)| # matches 12,345,678
                          ((\d(?=[\s.,]\d\d\d))((?<=\d)([\s.,]\d\d\d))([\s.,]\d\d\d)+)| # matches 1,234,567
                          (((?<!\d[\s.,])(?<!\d)(?<!\d\d[\s.,])(?<!\d\d\d[\s.,])\d\d(?=[\s.,]\d\d\d))((?<=\d\d)[\s.,]\d\d\d))| # matches 12,345
                          (((?<!\d[\s.,])(?<!\d)(?<!\d\d[\s.,])(?<!\d\d\d[\s.,])\d(?![\s.,]\d\d)(?=[\s.,]\d\d\d))((?<=\d)[\s.,]\d\d\d))| # matches 1,234''', re.VERBOSE)

当我这样做时,我想要那个

mo = number_regex1.search('12,345,67') 

没有匹配,因为 12,345,67 不是数字

标签: pythonregex

解决方案


你应该使用

re.findall(r'(?<!\d,)(?<!\d)\d{1,3}(?:,\d{3})*(?!,?\d)', text)

请参阅正则表达式演示和正则表达式图:

在此处输入图像描述

细节

  • (?<!\d,)- 当前位置左侧不允许有数字和逗号
  • (?<!\d)- 当前位置的左边不允许有数字
  • \d{1,3}- 1 到 3 位数字
  • (?:,\d{3})*- 0 次或多次重复,和 3 位数字序列
  • (?!,?\d)- 没有可选,的,然后在当前位置的右侧允许一个数字。

请注意,两个lookbehinds 是必需的(?<!\d,)(?<!\d)——因为lookbehinds 必须是固定宽度的((?<!\d,|\d)不起作用)。


推荐阅读