You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:42:08