Python pexpect匹配含ANSI颜色码输出失败,如何忽略颜色码完成匹配
pexpect交互忽略ANSI颜色码解决方案
pexpect本身没有内置忽略ANSI转义码的配置开关,无需提前获取完整响应,可通过以下两种方案解决:
方案1:改造正则匹配规则
在原有匹配模式中插入ANSI颜色码的可选匹配片段,让正则可以匹配夹杂颜色码的文本:
import pexpect import re # ANSI颜色转义码匹配片段 ansi_pat = r'\x1b\[[0-9;]*m' # 编译正则:允许任意位置穿插ANSI颜色码 prompt1 = re.compile( rf"Parameter\s+(?:{ansi_pat}\s+)*1\s+(?:{ansi_pat}\s+)*of\s+(?:{ansi_pat}\s+)*3,\s+(?:{ansi_pat}\s+)*restartRank\s+(?:{ansi_pat}\s+)*\(enumRef-ReqFieldReplaceableUnit.RestartRank\):\s+(?:{ansi_pat}\s+)*Enter\s+(?:{ansi_pat}\s+)*one\s+(?:{ansi_pat}\s+)*of\s+(?:{ansi_pat}\s+)*the\s+(?:{ansi_pat}\s+)*following\s+(?:{ansi_pat}\s+)*integers:\s+(?:{ansi_pat}\s+)*0:RESTART_WARM,\s+(?:{ansi_pat}\s+)*1:RESTART_COLD,\s+(?:{ansi_pat}\s+)*2:RESTART_COLDWTEST:" ) expectprompts = [failPrmt, prompt1, pexpect.TIMEOUT, pexpect.EOF] i = childconn.expect(expectprompts, timeout=tmOut)
方案2:自定义spawn子类全局过滤ANSI码
继承pexpect.spawn重写读取方法,在数据进入匹配逻辑前自动移除所有ANSI码和多余回车符,原有匹配规则无需任何修改:
import pexpect import re class SpawnClean(pexpect.spawn): # 同时匹配ANSI颜色码和回车符^M _clean_re = re.compile(rb'\x1b\[[0-9;]*m|\r') def read_nonblocking(self, size=1, timeout=-1): raw_data = super().read_nonblocking(size, timeout) return self._clean_re.sub(b'', raw_data) # 用自定义类替代原生pexpect.spawn创建连接 childconn = SpawnClean("你的节点交互命令") # 直接使用原有未修改的prompt1即可正常匹配 expectprompts = [failPrmt, prompt1, pexpect.TIMEOUT, pexpect.EOF] i = childconn.expect(expectprompts, timeout=tmOut)
该方案一次修改全局生效,适合存在大量匹配规则的场景。
内容的提问来源于stack exchange,提问作者punithavel
相关产品推荐
相关产品推荐

