python - 如何匹配格式为 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 不是数字
解决方案
你应该使用
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)
不起作用)。
推荐阅读
- android - Room @Relation using a composite index
- r - Changing ae, oe, ue into umlaut
- ios - React Native - iOS Real Device - Socket IO Web Sockets not Working
- spring-boot - how to use spring-data-elasticsearch in spring-boot starter 2.1.4?
- c++ - 为什么我们有类型不匹配?
- c# - Doubleclick on notifyicon works only the second time
- java - How to convert Image url to Byte Array in java?
- c# - 部分视图刷新后更新模态数据
- kotlin - 如何正确检查可空中缀接收器上的空值?
- spring-security - Using Spring Security 5.1.4, is it possible to have a custom HttpFirewall for a specific url-pattern?