Python拆分路由器API动态格式时间字符串的优雅方案求助
优雅拆分动态长度的时间字符串(如"4d12h33m59s")
嘿,这个需求我之前做路由器相关开发时也碰到过,这种紧凑的时间格式确实需要灵活的解析方式。下面我给你两种实用又优雅的实现思路,不管是追求简洁高效还是自定义可控性都能满足。
方案一:正则表达式(最简洁高效)
正则是处理这种模式匹配的绝佳工具,我们可以用一个匹配数字+时间单位的正则表达式,一次性提取所有时间片段。
核心正则规则
(\d+[ywdhms])
\d+:匹配一个或多个连续数字[ywdhms]:精准匹配时间单位(年y、周w、天d、小时h、分钟m、秒s)
代码示例(Python)
import re def split_time_string(time_str): # 定义匹配规则 pattern = r'(\d+[ywdhms])' # 提取所有符合规则的片段 return re.findall(pattern, time_str) # 测试所有示例格式 test_cases = [ "4d12h33m59s", "12h33m59s", "12y14w4d12h33m59s", "12m23s", "33s" ] for case in test_cases: print(f"输入: {case} → 输出: {split_time_string(case)}")
运行结果
输入: 4d12h33m59s → 输出: ['4d', '12h', '33m', '59s'] 输入: 12h33m59s → 输出: ['12h', '33m', '59s'] 输入: 12y14w4d12h33m59s → 输出: ['12y', '14w', '4d', '12h', '33m', '59s'] 输入: 12m23s → 输出: ['12m', '23s'] 输入: 33s → 输出: ['33s']
这个方案的优点是代码量极少,自动适配所有包含指定单位的时间字符串,不管顺序和长度如何变化,都能准确拆分。
方案二:手动遍历解析(更可控)
如果你不想依赖正则,或者需要对解析过程做更多自定义处理(比如验证单位合法性、处理非法输入),可以手动遍历字符串来拆分:
代码示例(Python)
def split_time_string_manual(time_str): # 定义合法的时间单位集合 valid_units = {'y', 'w', 'd', 'h', 'm', 's'} result = [] current_num = [] for char in time_str: if char.isdigit(): # 收集连续的数字字符 current_num.append(char) elif char in valid_units: # 遇到合法单位时,拼接数字和单位并加入结果 if current_num: result.append(''.join(current_num) + char) current_num = [] else: # 遇到非法字符时可自定义处理,这里直接抛出异常 raise ValueError(f"时间格式包含非法字符:{char}") # 检查是否有未匹配单位的残留数字 if current_num: raise ValueError(f"无效的时间格式:{time_str},结尾存在无单位的数字") return result # 测试同样的用例 for case in test_cases: print(f"输入: {case} → 输出: {split_time_string_manual(case)}")
这个方案的好处是你可以完全控制每一步,比如添加单位校验、处理非法输入等,适合对鲁棒性要求更高的场景。
额外小提示
- 如果需要进一步将片段转换成数值(比如把"4d"转换成数字4),可以在拆分后遍历处理:
int(item[:-1])提取数字,item[-1]获取单位。 - 如果API返回的单位有大小写变种(比如
Y/W),可以在正则里改成[yYwWdDhHmMsS],或者手动解析时先统一转成小写/大写再判断。
内容的提问来源于stack exchange,提问作者Ilja Leiko
相关产品推荐
相关产品推荐

