如何在不计算文本格式的情况下获取字符串的长度

How to get the length of a string without calculating the formatting of the text

例如,我正在使用一个名为 colored 的库,它可以为控制台格式化字符串。 我正在尝试获取该字符串的长度,但是 len() 也会计算未显示在控制台中的格式化字母……例如,如果我将字符串“test”设置为绿色看起来像这样:“\x1b[38;5;2mtest”, 当我打印它时,它只是以绿色打印测试,所以我只希望字母数显示 4。 无论您使用什么库,格式看起来都一样。有什么方法可以获取字符串的长度并忽略它的格式吗?

import re
s = "\x1b[38;5;2mtest"
lenth = len(re.sub("\x1b\[\d*;\d*;\d*m", "", s))

下面是对正则表达式的解释:https://regexr.com/630m7

是的,有。我前段时间做了一个函数来做这个。

import re

def len_no_ansi(string):
    return len(re.sub(
        r'[\u001B\u009B][\[\]()#;?]*((([a-zA-Z\d]*(;[-a-zA-Z\d\/#&.:=?%@~_]*)*)?\u0007)|((\d{1,4}(?:;\d{0,4})*)?[\dA-PR-TZcf-ntqry=><~]))', '', string))

致谢:https://github.com/chalk/ansi-regex/blob/0755e661553387cfebcb62378181e9f55b2567ff/index.js