Python正则提取所有HHmmss-HHmmss格式时间范围问题求助
解决Python提取所有时间范围字符串的问题
问题原因
你当前的代码有两个核心问题:
re.search()仅会返回字符串中第一个完整匹配的结果,无法遍历所有符合条件的子串。- 正则表达式中的重复捕获组
(.*(\d{4,10}-\d{4,10}))*会覆盖之前的捕获结果,最终只能保留最后一个匹配的时间范围。
解决方案
使用 re.findall() 替代 re.search(),同时简化正则表达式,直接匹配目标格式的子串:
import re text = "random text 0700-1300 random text 1830-2230 random 1231 text" # 匹配4-6位数字连字符连接的格式(兼容HHmm-HHmm和HHmmss-HHmmss) regex = r'\d{4,6}-\d{4,6}' time_ranges = re.findall(regex, text) print(time_ranges) # 输出: ['0700-1300', '1830-2230']
进阶:严格验证时间合法性
如果需要确保提取的是合法的时间范围(比如小时00-23,分钟/秒00-59),可以使用更精准的正则:
# 同时匹配HHmm-HHmm和HHmmss-HHmmss格式的合法时间 strict_regex = r'(?:[01]\d|2[0-3])[0-5]\d(?:[0-5]\d)?-(?:[01]\d|2[0-3])[0-5]\d(?:[0-5]\d)?' valid_time_ranges = re.findall(strict_regex, text) print(valid_time_ranges) # 输出: ['0700-1300', '1830-2230']
关键说明
re.findall()会遍历整个字符串,返回所有符合正则的子串列表,无匹配项时返回空列表,完全满足你提取0个或任意数量时间范围的需求。- 避免在正则中使用冗余的
.*匹配,直接定位目标格式的子串即可,减少匹配逻辑的复杂度。
内容的提问来源于stack exchange,提问作者4mla1fn
相关产品推荐
相关产品推荐

