python中字符串的打印长度



有没有办法在python中找到(甚至是最好的猜测)字符串的"打印"长度?例如,"potaa\bto"在len中为8个字符,但在tty上只打印了6个字符宽。

预期用途:

s = 'potatox1b[01;32mpotatox1b[0;0mpotato'
len(s)   # 32
plen(s)  # 18

至少对于ANSI TTY转义序列,这是有效的:

import re
strip_ANSI_pat = re.compile(r"""
    x1b     # literal ESC
    [       # literal [
    [;d]*   # zero or more digits or semicolons
    [A-Za-z] # a letter
    """, re.VERBOSE).sub
def strip_ANSI(s):
    return strip_ANSI_pat("", s)
s = 'potatox1b[01;32mpotatox1b[0;0mpotato'
print s, len(s)
s1=strip_ANSI(s)
print s1, len(s1)

打印:

potato[01;32mpotato[0;0mpotato 32
potatopotatopotato 18

对于backspaces\b或垂直制表符或\r\n-取决于打印方式和位置,不是吗?

bashshell有着完全相同的需求,以便在提示字符串中存在不可打印字符的情况下,知道用户键入的输入何时换行到下一行。他们的解决方案是甚至不尝试——相反,他们要求任何设置提示字符串的人都将[]放在提示的非打印部分周围。打印的长度计算为字符串的长度,过滤掉这些特殊序列和它们之间的所有文本。(当然,输出中省略了特殊序列。)

字符串的打印长度取决于字符串的类型。

python 2.x中的普通字符串在utf-8中。utf-8的长度为等于字符串中的字节。将类型更改为unicode,len()提供现已印刷的标志。因此格式化工作:

value = 'abcäöücdf'
len_value  = len(value)
len_uvalue = len(unicode(value,'utf-8'))
size = self['size'] + len_value-len_uvalue
print value[:min(len(value),size)].ljust(size)

最新更新