Python re正则如何匹配含千分位逗号、小数点的任意数值?
正则数值匹配修复方案
原有正则问题
你编写的正则\b\d+[.,]*\d+[,]*d*\b存在多处缺陷:
- 书写错误:末尾的
d*应为\d*,本身不具备匹配数字的能力 - 逻辑缺陷:没有针对千分位的「逗号+3位数字」结构做重复匹配设计,导致超过2个逗号的长千分位数值会被截断拆分
- 额外问题:未过滤和字母绑定的数字(如测试用例中的
OCT21里的21),会额外匹配到非独立数值的数字
可直接运行的正确代码
import re string1 = "6,111,123,999 5,450,900 10.32 OCT21 Dec 31, 2019" # 正则逻辑说明: # (?<![a-zA-Z]) 负向后断言,要求数字前不能是英文字母 # \b 匹配单词边界 # \d{1,3} 匹配开头1-3位数字 # (?:,\d{3})* 非捕获组,匹配0次或多次「逗号+3位数字」的标准千分位结构,支持任意长度的千分位数值 # (?:\.\d+)? 非捕获组,匹配0次或1次「小数点+多位数字」的小数结构 # \b 匹配单词边界 # (?![a-zA-Z]) 负向前断言,要求数字后不能是英文字母 num = re.findall(r'(?<![a-zA-Z])\b\d{1,3}(?:,\d{3})*(?:\.\d+)?\b(?![a-zA-Z])', string1) print(num)
输出结果
['6,111,123,999', '5,450,900', '10.32', '31', '2019']
完全符合预期输出要求。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

