【问题标题】:python colored text without modifying the stringpython 彩色文本而不修改字符串
【发布时间】:2018-05-20 12:15:15
【问题描述】:

我有一个 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 代码),所以字符的索引不再是它看起来的样子。

想象一下,我现在想通过将其他一些片段涂成蓝色来再次处理彩色字符串。我不再信任索引,因为我的字符串现在比看起来要大。

当然,我可以更新索引以指向新字符串中的正确位置,但我只是想知道是否有更简单的方法来做到这一点。

【问题讨论】:

  • Python 不理解 ANSI 控制字符,所以它当然会计算它们。我将创建一个字符串包装器并为长度保留一个字符索引值表 - 这样,每当您添加一个 ANSI 控制结构时,您将其长度添加到字符位置的表中,然后检索“修改”是微不足道的通过简单的sum(index_table[:index])索引。

标签: python string colors ansi


【解决方案1】:

您可以对字符串着色进行包装,并在保持原始字符串不变的同时打印返回值:

示例中未显示,但您可以对原始字符串进行切片,以选择性地将子字符串传递给包装器,并使用适当的 kwarg 值,并将返回的值重新组合到一个新字符串中,以便进一步处理或打印.

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'))

编辑:

在 cmets 中添加 @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中,字符串是不可变的,所以你永远不要修改它,你总是创建副本。
  • 我认为 OP 正在寻找类似''.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')])
  • 有效点,但实际上它并没有真正的区别,因为我们用来引用字符串的变量可变的。如果您的变量现在指向一个新字符串,而没有任何内容指向旧字符串,那么它在功能上与更改字符串相同。
  • 我看到@DanFarrel,谢谢你的精确。我更多的是考虑将要打印的数据保留在课堂上;可能是__str____repr__,然后将此结果与参数一起传递给包装器以强调“东西”......就像你会做的那样,例如,强调数组的哪些元素已更改,或者哪些元素已更改一个临界值...
猜你喜欢
  • 1970-01-01
  • 2017-04-06
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2014-11-26
  • 2018-06-26
相关资源
最近更新 更多