Python中英制单位提取异常求助:无法识别ft/sec²等复合单位
解决方案
问题出在正则表达式的单位匹配顺序——当短单位(比如ft)出现在复合单位(比如ft/sec)前面时,正则会优先匹配更短的模式,导致复合单位被截断识别。把更具体、更长的单位放在匹配列表的最前面,就能解决这个问题。
修改后的代码:
import re from collections import defaultdict def extractUnitsFromText(text): # 把复合单位、长单位放在最前面,优先匹配 pattern = r'(?P<value>\d+\.?\d*)[-\s]*?(?P<unit>(?:ft/sec²|ft/s²|ft/s2|ft/sec|ft/s|lb/ft|lb\s*/\s*ft|inches\.?|in\.?|feet|ft\.?|pounds?|slug(?:s)?)(?:\^[\d]+)?)' matches = re.finditer(pattern, text, re.IGNORECASE) # 适配大小写混合的场景 units_dict = defaultdict(list) for match in matches: value = float(match.group('value')) unit = match.group('unit').strip().lower() # 统一单位格式,方便后续转换 unit = unit.replace('lbs', 'lb')\ .replace('in.', 'in')\ .replace('inches', 'in')\ .replace('feet', 'ft')\ .replace('pounds', 'lb')\ .replace(' ', '') # 去除单位内部空格,比如lb / ft转为lb/ft units_dict[unit].append(value) return dict(units_dict)
关键修改说明:
- 调整匹配顺序:将
ft/sec²、lb/ft这类复合单位放在ft、in等单个单位的前面,确保正则优先匹配完整的复合单位,避免被短单位截断。 - 忽略大小写匹配:添加
re.IGNORECASE参数,兼容文本中单位大小写混合的情况(比如Ft/Sec、LB/FT)。 - 增强单位标准化:新增多种单位别名的统一转换逻辑,让字典中的单位格式更一致,减少后续转换的额外处理。
测试效果:
输入文本"The speed is 10 ft/sec, acceleration is 32 ft/s², load is 5 lb/ft and length is 12 inches",函数会返回:
{'ft/sec': [10.0], 'ft/s²': [32.0], 'lb/ft': [5.0], 'in': [12.0]}
内容的提问来源于stack exchange,提问作者Hidde
相关产品推荐
相关产品推荐

