使用多正则表达式模式提取列表时间值并求和
提取任意位置的时间值并求和
问题需求
需要从以下字符串列表中提取时间值并求和,时间值位置不固定,可能在圆括号、方括号内,也可能在行首、行尾等位置,要求用包含多个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}")
代码说明
- 正则匹配:通过多分支正则捕获所有可能的时间值格式,涵盖带括号、带单位、纯数值的情况
- 数值提取:遍历每个匹配的捕获组,筛选出有效的数值字符串
- 单位转换:若匹配到分钟单位(
m),将数值除以60转换为小时 - 求和逻辑:逐行累加时长,最终输出所有行的总时长
运行输出
当前行 '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
相关产品推荐
相关产品推荐

