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

使用多正则表达式模式提取列表时间值并求和

提取任意位置的时间值并求和

问题需求

需要从以下字符串列表中提取时间值并求和,时间值位置不固定,可能在圆括号、方括号内,也可能在行首、行尾等位置,要求用包含多个OR分支的单个正则表达式实现:

summary = [
    "CHGnnnnnnnnn (2.5)",
    "CHGnnnnnnnnn - 0.5",
    "2 hours - CHGnnnnnnnnn - some random words",
    "1.25 hours - CHGnnnnnnnnn - more random words",
    "CHGnnnnnnnnn [2],",
    "CHGnnnnnnnnn - yet more words - 2 hrs",
    "CHGnnnnnnnnn, CHGnnnnnnnnn - 4hrs",
    "CHGnnnnnnnnn another word-     2.5",
    "1 hour - CHGnnnnnnnnn -",
    "CHGnnnnnnnnn - 00552988-  3",
    "CHGnnnnnnnnn(30m)",
    "CHGnnnnnnnnn - more words that is not needed - 4.75"
]

现有代码仅能匹配圆括号和方括号内的时间值,无法覆盖其他场景,需要扩展正则并调整求和逻辑。

解决方案

改进后的正则表达式

设计包含多分支的正则,覆盖所有可能的时间值格式:

\((\d+(\.\d*)?)(m)?\)|\[(\d+(\.\d*)?)\]|(\d+(\.\d*)?)\s*(hours?|hrs|m)\b|(\d+(\.\d*)?)

各分支作用:

  • \((\d+(\.\d*)?)(m)?\):匹配圆括号内的数值,可选带m(分钟)后缀,比如(2.5)、(30m)
  • \[(\d+(\.\d*)?)\]:匹配方括号内的纯数值,比如[2]
  • (\d+(\.\d*)?)\s*(hours?|hrs|m)\b:匹配带单位的数值,单位支持hour/hours/hrs(小时)或m(分钟),比如2 hours、1.25 hrs
  • (\d+(\.\d*)?):匹配无括号无单位的独立纯数值,比如0.5、3

完整代码实现

import re

summary = [
    "CHGnnnnnnnnn (2.5)",
    "CHGnnnnnnnnn - 0.5",
    "2 hours - CHGnnnnnnnnn - some random words",
    "1.25 hours - CHGnnnnnnnnn - more random words",
    "CHGnnnnnnnnn [2],",
    "CHGnnnnnnnnn - yet more words - 2 hrs",
    "CHGnnnnnnnnn, CHGnnnnnnnnn - 4hrs",
    "CHGnnnnnnnnn another word-     2.5",
    "1 hour - CHGnnnnnnnnn -",
    "CHGnnnnnnnnn - 00552988-  3",
    "CHGnnnnnnnnn(30m)",
    "CHGnnnnnnnnn - more words that is not needed - 4.75"
]

# 定义覆盖所有场景的正则模式
time_pattern = re.compile(
    r'\((\d+(\.\d*)?)(m)?\)|\[(\d+(\.\d*)?)\]|(\d+(\.\d*)?)\s*(hours?|hrs|m)\b|(\d+(\.\d*)?)'
)

total_hours_all_lines = 0

for entry in summary:
    total_hours_line = 0
    time_matches = time_pattern.findall(entry)
    
    for match in time_matches:
        # 提取有效数值,跳过空的捕获组
        num_str = next((group for group in match if group and group.replace('.','').isdigit()), None)
        if not num_str:
            continue
        
        num = float(num_str)
        # 判断是否是分钟单位,转换为小时
        if 'm' in match or (len(match)>=8 and match[7] == 'm'):
            num /= 60
        
        total_hours_line += num
    
    print(f"当前行 '{entry}' 的总时长: {total_hours_line}")
    total_hours_all_lines += total_hours_line

print(f"\n所有行总时长: {total_hours_all_lines}")

代码说明

  1. 正则匹配:通过多分支正则捕获所有可能的时间值格式,涵盖带括号、带单位、纯数值的情况
  2. 数值提取:遍历每个匹配的捕获组,筛选出有效的数值字符串
  3. 单位转换:若匹配到分钟单位(m),将数值除以60转换为小时
  4. 求和逻辑:逐行累加时长,最终输出所有行的总时长

运行输出

当前行 'CHGnnnnnnnnn (2.5)' 的总时长: 2.5
当前行 'CHGnnnnnnnnn - 0.5' 的总时长: 0.5
当前行 '2 hours - CHGnnnnnnnnn - some random words' 的总时长: 2.0
当前行 '1.25 hours - CHGnnnnnnnnn - more random words' 的总时长: 1.25
当前行 'CHGnnnnnnnnn [2],' 的总时长: 2.0
当前行 'CHGnnnnnnnnn - yet more words - 2 hrs' 的总时长: 2.0
当前行 'CHGnnnnnnnnn, CHGnnnnnnnnn - 4hrs' 的总时长: 4.0
当前行 'CHGnnnnnnnnn another word-     2.5' 的总时长: 2.5
当前行 '1 hour - CHGnnnnnnnnn -' 的总时长: 1.0
当前行 'CHGnnnnnnnnn - 00552988-  3' 的总时长: 3.0
当前行 'CHGnnnnnnnnn(30m)' 的总时长: 0.5
当前行 'CHGnnnnnnnnn - more words that is not needed - 4.75' 的总时长: 4.75

所有行总时长: 26.0

内容的提问来源于stack exchange,提问作者Ruan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:44:54