python中字符串的打印长度

时间:2013-02-15 06:34:54

标签: python string pretty-print tty

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

预期用途:

s = 'potato\x1b[01;32mpotato\x1b[0;0mpotato'
len(s)   # 32
plen(s)  # 18

3 个答案:

答案 0 :(得分:2)

至少对于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 = 'potato\x1b[01;32mpotato\x1b[0;0mpotato'

print s, len(s)
s1=strip_ANSI(s)
print s1, len(s1)

打印:

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

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

答案 1 :(得分:1)

bash 外壳程序具有完全相同的需求,以便知道在提示字符串中存在不可打印的字符时,用户键入的输入何时换行到下一行。他们的解决方案是甚至不尝试-相反,他们要求任何设置提示字符串的人都将\[\]放在提示的非打印部分周围。计算出的打印长度就是字符串的长度,其中包括这些特殊序列以及它们之间的所有文本。 (当然,输出时会省略特殊序列。)

答案 2 :(得分:0)

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

  

python 2.x中的普通字符串是utf-8。 utf-8的长度是   等于String中的字节数。将类型更改为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)