调试 Python 函数以删除 ANSI 代码

Debugging a Python function to remove ANSI codes

我的问题实际上有两个部分。我写了一个函数来通过简单的替换从字符串中删除 ANSI 代码,但是函数 returns 是字符串。我已经尝试使用 pdb 进行调试,但结果没有意义,因为 Python 本身似乎存在故障。但是我对此表示怀疑,所以我试图找出我在代码中没有看到的错误。另外我想知道是否有更好的方法来删除(可能尚未看到)ANSI 代码而无需每次都修改函数。

这是一张让我感到困惑的 pdb 屏幕截图: pdb screenshot of function debugging

n_text 未设置,targets 设置为奇怪的东西并且执行行指针以某种方式设置到不可执行行 (157)。 当我使用 re 而不是 string.replace.

时,我一直有类似的错误

函数是

def clean_ansi(text, remove=''):
    # remove ANSI control codes
    n_text = text
    targets = [''.join([chr(cde) for cde in [27, 91, 67]]),
               ''.join([chr(cde) for cde in [27, 91, 48, 109]]),
               ''.join([chr(cde) for cde in [27, 91, 49, 109]])]

    for target in targets:
        n_text = n_text.replace(target, '')
    return n_text

对于这个例子,我要清理的字符串是

'?- human(socrates)\n\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C.\n\x1b[1mtrue.\x1b[0m\n\n?- '

而预期的 return 是

'?- human(socrates)\n.\ntrue.\n\n?- '

把事情放在上下文中,这是项目的一部分 to create a command-line IDE,当查询被传递到 SWI-Prolog 实例(通过 pexpect)并且输出被解析为仅提供实际结果,在本例中为 true。

您的代码应该从提供的字符串中清除 ANSI 代码,您确定您的调用正确吗?

无论哪种方式,它都只会去除选定的代码,这不是一种特别优雅或高效的方法 - 我建议您使用正则表达式并省去一些麻烦:

import re

ANSI_CLEANER = re.compile(r"(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]")

clean_string = ANSI_CLEANER.sub("", your_string)

print(repr(clean_string))
# prints '?- human(socrates)\n.\ntrue.\n\n?- '