如何用Python正则提取输出消息并优化CH1-11测试循环代码
Pexpect通道测试代码优化方案
代码优化后完整实现
import pexpect import sys import re import io def quick_test(): # 同时捕获输出到缓存和控制台,方便后续正则提取结果 output_cache = io.BytesIO() ch = pexpect.spawn('ssh to server') # 自定义写入逻辑,同时输出到控制台和缓存 def write_both(data): output_cache.write(data) sys.stdout.buffer.write(data) ch.logfile = write_both ch.expect("Select channels") print("\n########################################\n") ch.sendline("1") ch.expect("Enter ch to run:") # 需求1:遍历1-11的循环替代逐行编写的冗余逻辑 for ch_num in range(1, 12): test_cmd = f"CH{ch_num},0" ch.sendline(test_cmd) # 兼容原有首通道打印after的逻辑 if ch_num == 1: print(ch.after) # 等待测试完成的提示 ch.expect("Enter Test:") print(ch.before) # 需求2:正则提取所有通道测试结果 output_content = output_cache.getvalue().decode('utf-8') # 匹配CH编号和对应状态的正则规则 result_pattern = r'CH(\d+),0 Result: (SUCCESS|FAILED)' matches = re.findall(result_pattern, output_content) # 转为字典方便按通道编号排序输出 result_dict = {int(ch_num): status for ch_num, status in matches} # 按要求格式输出结果 print("\n===== 测试结果汇总 =====") for ch_num in range(1, 12): status = result_dict.get(ch_num, "UNKNOWN") print(f"<p>CH{ch_num}: {status}</p>") if __name__ == '__main__': quick_test()
关键修改说明
- 循环优化:用
range(1,12)生成1到11的通道编号,把重复的命令发送、结果等待逻辑封装到循环内,完全替代逐行编写的CH1到CH11测试代码 - 结果提取:通过缓存全量运行输出,用正则批量匹配所有通道的测试结果,即使结果行随机分布在海量输出中也能准确提取
- 兼容原有逻辑:保留了原代码的交互流程、打印规则,不会改动原有测试的执行逻辑
内容的提问来源于stack exchange,提问作者Shishira
相关产品推荐
相关产品推荐

