You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:09:02