python 不修改字符串的彩色文本
python colored text without modifying the string
我有一个 python 字符串:
my_string = 'thisisjustadummystringfortestingpurposes'
我想用红色打印字符串的某些区域,所以我使用 ANSI 转义码:
- 红色: '\x1b[31m'
- 黑色: '\x1b[0m'
然后我要做的是,创建一个插入了 ANSI 代码的新字符串。
示例:
my_color_seq = seq[:5] # 0:5 will be black
my_color_seq += '\x1b[31m' # start red
my_color_seq += seq[5:10] # 5:10 will be red
my_color_seq += '\x1b[0m' # start black
my_color_seq += seq[10:] # 10: will be black
print(my_color_seq)
此代码有效并正确打印区域 5:10 红色。
我什至创建了一个循环,我可以在其中使用我想要用红色着色的区域的索引和长度列表。
现在的问题是在我的彩色字符串中包含不可见的字符(ANSI 代码),因此字符的索引不再是它看起来的样子。
想象一下,我现在想通过用蓝色绘制一些其他片段来再次处理彩色字符串。我不能再相信索引,因为我的字符串现在比看上去的要大。
当然我可以更新索引以指向新字符串中的正确位置,但我只是想知道是否有更简单的方法。
您可以围绕字符串着色进行包装,并在保持原始字符串不变的情况下打印返回值:
示例中未显示,但您可以对原始字符串进行切片,以使用适当的 kwarg 值有选择地将子字符串传递给包装器,然后重新 assemble 新字符串中的返回值可以进一步处理,或印刷。
def colorize(token, bold_and_al='', fg_color='', bg_color=''):
prefix = '\x1b['
suffix = 'm'
reset = '\x1b[0m'
return '\x1b[' + bold_and_al + ";" + fg_color + ";" + bg_color + "m" + token + reset
a = 'thisisjustadummystringfortestingpurposes'
print(colorize(a, bold_and_al='1', fg_color='34', bg_color='42'))
编辑:
在评论中添加@MadPhysicist 提出的示例,以说明如何使用 colorize
包装器。:
print(''.join([colorize(a[:5], bold_and_al='1', fg_color='34', bg_color='42'), a[5:10], colorize(a[10:], bold_and_al='1', fg_color='32', bg_color='44')]))
我有一个 python 字符串:
my_string = 'thisisjustadummystringfortestingpurposes'
我想用红色打印字符串的某些区域,所以我使用 ANSI 转义码:
- 红色: '\x1b[31m'
- 黑色: '\x1b[0m'
然后我要做的是,创建一个插入了 ANSI 代码的新字符串。
示例:
my_color_seq = seq[:5] # 0:5 will be black
my_color_seq += '\x1b[31m' # start red
my_color_seq += seq[5:10] # 5:10 will be red
my_color_seq += '\x1b[0m' # start black
my_color_seq += seq[10:] # 10: will be black
print(my_color_seq)
此代码有效并正确打印区域 5:10 红色。 我什至创建了一个循环,我可以在其中使用我想要用红色着色的区域的索引和长度列表。
现在的问题是在我的彩色字符串中包含不可见的字符(ANSI 代码),因此字符的索引不再是它看起来的样子。
想象一下,我现在想通过用蓝色绘制一些其他片段来再次处理彩色字符串。我不能再相信索引,因为我的字符串现在比看上去的要大。
当然我可以更新索引以指向新字符串中的正确位置,但我只是想知道是否有更简单的方法。
您可以围绕字符串着色进行包装,并在保持原始字符串不变的情况下打印返回值:
示例中未显示,但您可以对原始字符串进行切片,以使用适当的 kwarg 值有选择地将子字符串传递给包装器,然后重新 assemble 新字符串中的返回值可以进一步处理,或印刷。
def colorize(token, bold_and_al='', fg_color='', bg_color=''):
prefix = '\x1b['
suffix = 'm'
reset = '\x1b[0m'
return '\x1b[' + bold_and_al + ";" + fg_color + ";" + bg_color + "m" + token + reset
a = 'thisisjustadummystringfortestingpurposes'
print(colorize(a, bold_and_al='1', fg_color='34', bg_color='42'))
编辑:
在评论中添加@MadPhysicist 提出的示例,以说明如何使用 colorize
包装器。:
print(''.join([colorize(a[:5], bold_and_al='1', fg_color='34', bg_color='42'), a[5:10], colorize(a[10:], bold_and_al='1', fg_color='32', bg_color='44')]))