有没有办法在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)