9

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

预期用途:

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

3 回答 3

3

至少对于 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 - 这取决于它的打印方式和位置,不是吗?

于 2013-02-15T06:47:13.183 回答
1

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

于 2018-07-17T22:19:26.433 回答
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)
于 2015-04-02T09:49:50.097 回答