You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中含ANSI颜色的字符串对齐失效问题求助

解决Python中ANSI颜色标签与字符串右对齐冲突的问题

这个问题我之前踩过坑!本质是Python的字符串对齐方法(像rjust()、ljust()、center()这些)会把ANSI颜色转义序列当成普通字符计算长度,但这些序列在终端里是不可见的,不会占据显示宽度,所以才导致对齐错乱。

举个例子,你可能写过这样的代码:

RED = '\033[91m'
RESET = '\033[0m'

text1 = "text"
text2 = f"{RED}text{RESET}"

print(text1.rjust(20))
print(text2.rjust(20))

运行后会发现第二个带颜色的"text"缩进明显比第一个少——因为len(text2)算出来是13(包含了颜色转义序列的长度),但终端实际显示的有效字符只有4个,所以rjust(20)给它加了7个空格,而普通字符串"text"加了16个空格,自然不对齐。

解决方案

有两种靠谱的处理方式,按需选择:

1. 手动计算可见长度(无需额外依赖)

自己写函数移除ANSI转义序列,算出真实的显示长度,再手动添加对应数量的空格:

import re

def get_visible_length(text):
    # 用正则匹配并移除所有ANSI颜色转义序列
    cleaned_text = re.sub(r'\x1b\[[0-9;]*m', '', text)
    return len(cleaned_text)

def colored_rjust(text, total_width):
    visible_len = get_visible_length(text)
    # 确保填充的空格数不会是负数
    padding = max(0, total_width - visible_len)
    return ' ' * padding + text

# 测试效果
RED = '\033[91m'
RESET = '\033[0m'

normal_text = "text"
colored_text = f"{RED}text{RESET}"

print(colored_rjust(normal_text, 20))
print(colored_rjust(colored_text, 20))

运行这段代码,两个"text"就会完美右对齐了。

2. 使用第三方库(更省心)

如果不想自己写正则处理,可以用专门处理ANSI文本的ansiwrap库,它已经封装了带颜色文本的对齐、换行等功能:

首先安装库:

pip install ansiwrap

然后直接用封装好的对齐函数:

from ansiwrap import ansirjust

RED = '\033[91m'
RESET = '\033[0m'

normal_text = "text"
colored_text = f"{RED}text{RESET}"

print(ansirjust(normal_text, 20))
print(ansirjust(colored_text, 20))

一行代码就能搞定,非常方便。如果需要左对齐或居中,对应使用ansiljust()和ansicenter()即可。

内容的提问来源于stack exchange,提问作者user9238048

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:25:01