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