Python 如何在不破坏ansi转义码的情况下替换字符串?

Python 如何在不破坏ansi转义码的情况下替换字符串?,python,python-3.x,replace,ansi-escape,Python,Python 3.x,Replace,Ansi Escape,以下脚本将打印,而不是打印 我理解这是因为.replace操作破坏了ANSI转义码。但这是不幸的 让.replace,或str.translate,或re.sub安全忽略转义码的简单方法是什么?使用前面答案中的,我们可以创建一个助手函数,只替换不属于此类序列的文本部分 假设这是utils.py: import re # https://stackoverflow.com/a/14693789/18771 ANSICODE = re.compile(r'\x1B[@-_][0-?]*[ -/]*

以下脚本将打印,而不是打印

我理解这是因为
.replace
操作破坏了ANSI转义码。但这是不幸的

.replace
,或
str.translate
,或
re.sub
安全忽略转义码的简单方法是什么?

使用前面答案中的,我们可以创建一个助手函数,只替换不属于此类序列的文本部分

假设这是utils.py

import re

# https://stackoverflow.com/a/14693789/18771
ANSICODE = re.compile(r'\x1B[@-_][0-?]*[ -/]*[@-~]')

def replace_ansi(imput_str, search_str, replace_str):
    pos = 0
    result = []
    for m in ANSICODE.finditer(imput_str):
        text = imput_str[pos:m.start()]
        text = text.replace(search_str, replace_str)
        result.append(text)
        result.append(m.group())
        pos = m.end()

    text = imput_str[pos:]
    result.append(text)
    return ''.join(result)
用法

印刷品

bla 1[1;31mbla 2[0mbla 3 bla X[1;31mbla 2[0mbla 3 bla 1[1;31mbla 2[0mbla 3 blax[1;31mbla2[0mbla3
使用unicode字符串制作应该是可行的。
s=u'1\x1b[1;31m2\x1b[0m3'
用于主字符串。然后
s=s.replace(u'1',u')
使用unicode比较来更改字符。同样
b'1\x1b[1;31m2\x1b[0m3'
二进制字符串在CLI接口中被广泛使用。@furkanayd我不确定我是否理解你的意思。你希望这样的操作成为可能吗?还是你声称
s=s.replace(u'1',u'')
的工作方式符合我的预期?我不是100%确定,但我们使用了大量的SSH、Telnet和CLI输出,这些输出都是二进制的,我们将它们转换为ascii来对不可读的文本进行分类。这是值得尝试的。我明白了这个想法,太好了:)干杯。我认为这太具体了,无法纳入标准库X)
from utils import replace_ansi

s1 = 'bla 1\x1b[1;31mbla 2\x1b[0mbla 3'
s2 = replace_ansi(s1, '1', 'X')
print(s1)
print(s2)
bla 1[1;31mbla 2[0mbla 3 bla X[1;31mbla 2[0mbla 3