Python如何用正则表达式捕获数字+度量单位+后续词的组合模式
正则提取三段式测量文本方案
需求说明
需要从长字符串中提取按固定顺序组成的三段式模式:
- 1位或2位可带小数点的数字,也支持整数加分数的形式,示例:
2 1/5 - 度量单位或对应符号,可选范围:
[ft, feet, foot, inch, ', "] - 紧跟在度量单位之后的描述词,示例:
height、long、width、t、w、l等
现有问题梳理
原有正则存在三个明显问题:
- 没有限制数字长度,会捕获两位以上的数字,不符合需求
- 多分支重复写相同的数字匹配逻辑,表达式冗余繁琐
- 未兼容整数加分数的数字格式,无法识别
2 1/5 ft这类写法
优化实现方案
优化思路
将正则按三段拆分,分别做逻辑优化后合并:
- 数字部分:用非捕获组兼容两种数字格式,同时通过
\d{1,2}限制整数部分最多2位,避免匹配超长数字 - 单位部分:把所有可选单位合并到同一个非捕获分组,无需重复写前置匹配逻辑
- 描述词部分:保留
\w+匹配即可,统一处理各段之间的空格匹配
完整实现代码
import re text = '''..text....it approx. 2.0 ft long 335.1 feet wide 9.5' high 2 1/5 ft height 12 inch wide and located.....text...''' # 优化后的正则表达式 pattern = r'\b(?:\d{1,2}(?:\.\d+)?|\d{1,2}\s+\d{1,2}\/\d{1,2})\s*(?:ft|feet|foot|inch|\'|")\s+\w+' matched_list = re.findall(pattern, text) print(matched_list)
运行结果
['2.0 ft long', "9.5' high", '2 1/5 ft height', '12 inch wide']
可以看到原有3位数字的335.1 feet wide已经被过滤,同时分数格式的2 1/5 ft height可以正常识别,正则长度也大幅精简。
内容的提问来源于stack exchange,提问作者Eng_GR
相关产品推荐
相关产品推荐

