有没有办法找到(甚至是最好的猜测)python中字符串的“打印”长度?例如。 'potaa \ bto'是len
中的8个字符,但在tty上只打印了6个字符。
预期用途:
s = 'potato\x1b[01;32mpotato\x1b[0;0mpotato'
len(s) # 32
plen(s) # 18
答案 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)