正则表达式匹配超出定义长度问题排查及修正请求
正则表达式匹配问题排查与修正
需求说明
需要捕获符合以下格式的数字:
- 长度1-5位且不以0开头的数字
- 后续为
.或, - 接着是2-3位数字
- 可选择跟一个
, - 可选择跟数字
预期匹配内容
7,93 8.32 20,43 100.23 2.800 1.597,72 2.026,88 33.000 33.000,43 100.000 150,000 150.000,50
不应匹配内容
7.3.2011 07.03.2011 3.2011
现有问题
使用正则表达式 (?<!\d)[\d]{1,5}(?!\d)[.,][\d]{2,3}[,]*[\d]* 测试字符串 7.3.2011 zwischen 7,93 und 10,53 EUR Dienstbeginn: 07.03.2011 时,意外匹配到了3.2011和07.03,不符合预期。
错误原因分析
- 匹配
3.2011的原因:正则中[\d]{2,3}会优先匹配20(前两位数字),后续[,]*[\d]*允许匹配0个逗号加任意数字,导致剩下的11被纳入匹配范围,最终整个3.2011被误判为符合规则。 - 匹配
07.03的原因:原正则[\d]{1,5}未限制首位不能为0,允许以0开头的数字,因此07被错误识别为合法的整数部分。
修正后的正则表达式
r"(?<!\d)[1-9]\d{0,4}[.,]\d{2,3}(?:,\d+)?(?!\d)"
规则解释
(?<!\d):负向后行断言,确保匹配的数字前面没有其他数字[1-9]\d{0,4}:严格限制为1-5位数字,首位非0[.,]:匹配小数点或逗号分隔符\d{2,3}:匹配2-3位数字的小数部分(?:,\d+)?:可选非捕获组,匹配"逗号+一个及以上数字"的后续部分(?!\d):负向前瞻断言,确保匹配内容后面没有多余数字,避免截断长串数字
验证代码
import re string = '7.3.2011 zwischen 7,93 und 10,53 EUR Dienstbeginn: 07.03.2011' salary = r"(?<!\d)[1-9]\d{0,4}[.,]\d{2,3}(?:,\d+)?(?!\d)" print(re.findall(salary, string))
运行后输出:['7,93', '10,53'],完全符合预期,不会匹配到错误内容。
内容的提问来源于stack exchange,提问作者Daniil Yefimov
相关产品推荐
相关产品推荐

