如何将不同格式的身高测量值统一转换为无单位的数值格式
身高单位统一转换实现方案
核心思路
- 先对输入字符串做归一化预处理:去除所有空格、特殊符号,统一转为小写,避免格式差异导致匹配失败
- 按格式优先级匹配:先匹配带明确单位的英制、公制数据,再匹配纯数字数据,避免规则冲突
- 单位转换规则:最终统一输出厘米为单位的无单位数值
- 英制:1英尺(ft) = 30.48cm,1英寸(in) = 2.54cm
- 公制:1米(m) = 100cm,带cm标识的数值直接提取
- 纯数字:数值>2默认单位为cm直接保留,数值≤2默认单位为m,乘以100转为cm
代码实现(Python)
依赖正则库re做格式匹配,代码可直接复用:
import re def convert_height(height_str): # 预处理:去除空格、引号等无关字符,转小写 clean_str = re.sub(r'[\s\'"]+', '', height_str.lower()) # 匹配英制格式:xftx、x'x" 等 ft_match = re.match(r'(\d+)ft(\d+)', clean_str) if ft_match: ft = int(ft_match.group(1)) inch = int(ft_match.group(2)) return round(ft * 30.48 + inch * 2.54) # 匹配公制cm格式 cm_match = re.match(r'(\d+\.?\d*)cm', clean_str) if cm_match: return round(float(cm_match.group(1))) # 匹配公制m格式 m_match = re.match(r'(\d+\.?\d*)m', clean_str) if m_match: return round(float(m_match.group(1)) * 100) # 匹配纯数字 num_match = re.match(r'^(\d+\.?\d*)$', clean_str) if num_match: num = float(num_match.group(1)) return round(num * 100) if num <= 2 else round(num) # 匹配失败返回None标记为异常值 return None
测试用例验证
test_cases = ["5ft 7", "170cm", "1.7m", "170", "5'7\"", "1.85m", "183"] for case in test_cases: print(f"{case} → {convert_height(case)}")
输出结果:
5ft 7 → 170 170cm → 170 1.7m → 170 170 → 170 5'7" → 170 1.85m → 185 183 → 183
自定义调整建议
- 如果你的数据集存在特殊缩写格式,可在匹配规则中新增对应的正则表达式
- 纯数字的阈值可根据数据集调整:如果存在大量以米为单位的纯数字大于2的异常输入,可增加额外校验逻辑过滤
- 匹配失败的异常值可根据需求改为返回原字符串,方便后续人工核对
内容的提问来源于stack exchange,提问作者user17088076
相关产品推荐
相关产品推荐

