如何重写正则表达式统一匹配3-4位数字加加号的组合场景?
正则优化实现方案
最优正则模式
pattern = r"(\d{3,4})\D*?\+\D*?(\d{3,4})"
对比现有写法的优势:
- 用
\d{3,4}严格限定数字长度为3或4位,完全贴合需求,不会误匹配5位及以上的无效数字 - 非贪婪匹配
\D*?适配数字和加号之间的任意非数字内容(包括货币符号、字母、空格、特殊字符等),不会出现吞字符的误匹配问题 - 不需要单独捕获加号做判断,只要能匹配到分组就符合格式要求,逻辑更简洁
完整可运行代码
import re # 测试用例 cells = [ "$800 + AXL $200", "USD1000+USD2000 no refund, expires Jan 20 2022", "$3000 + sometext $200", "$200 + sometext $3000" ] pattern = r"(\d{3,4})\D*?\+\D*?(\d{3,4})" for idx, cell in enumerate(cells, 1): match_res = re.search(pattern, cell) if match_res: num1 = int(match_res.group(1)) num2 = int(match_res.group(2)) total = num1 + num2 print(f"cell{idx}匹配成功,求和结果:{num1} + {num2} = {total}") else: print(f"cell{idx}未匹配到符合规则的内容")
运行输出
cell1匹配成功,求和结果:800 + 200 = 1000 cell2匹配成功,求和结果:1000 + 2000 = 3000 cell3匹配成功,求和结果:3000 + 200 = 3200 cell4匹配成功,求和结果:200 + 3000 = 3200
注意事项
建议用re.search而非re.match,后者要求模式从字符串开头匹配,若数字前存在其他内容会匹配失败,re.search会全局扫描字符串找到第一个符合规则的模式,适配性更强。
内容的提问来源于stack exchange,提问作者Capitán Planeta
相关产品推荐
相关产品推荐

