如何编写正则表达式识别字符串中带SI/英制单位的物理量
优化方案
你原来的正则主要缺少数值范围、复合单位、特殊符号前缀的适配,优化后的函数可以覆盖给出的所有测试用例:
import re def cleanup(s): pattern = re.compile( r"~?\d[,\d]*(?:\.\d+)?(?:\s*[x:-]\s*\d[,\d]*(?:\.\d+)?)*\s*[a-zA-Z°µ³][a-zA-Z0-9°µ³/*\s-]*?(?=\s*(?:[)@|/,=]|$|\)))", re.IGNORECASE ) # 清除匹配结果首尾多余的空白、制表符、换行符 return [res.strip() for res in pattern.findall(s)]
主要优化点:
- 新增
~?适配近似值前缀,可正确识别~3929cm³这类数值 - 数值部分兼容千位分隔符(如
4,868)、小数、x连接的尺寸、-连接的范围、:连接的比例,同时支持符号前后的空格,可正确识别15.6x1.4 in、3000-7500rpm、11.5:1这类格式 - 单位部分新增支持
³、空格、连字符、斜杠,可正确识别lb-ft、km/h、Gallon US这类复合单位 - 新增正向预查终止逻辑,匹配到单位后的括号、
@、|、/、逗号、等号、结束符就停止,避免匹配无关内容 - 最后对结果做首尾去空处理,输出格式更干净,不会残留换行、制表符
如果后续新增特殊单位,直接在单位的字符集([a-zA-Z°µ³])里加入对应字符即可,无需调整整体结构。
内容的提问来源于stack exchange,提问作者inkarar
相关产品推荐
相关产品推荐

