python中字符串的打印长度

python中字符串的打印长度,python,string,pretty-print,tty,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 至少对于ANSI TTY转义序列,这是有效的: import re strip_ANSI_pat = re.compile(r""" \x1b # literal ESC

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

预期用途:

s = 'potato\x1b[01;32mpotato\x1b[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 = '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

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

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

Python2.x中的普通字符串采用utf-8格式。utf-8的长度为 等于字符串中的字节数。将类型更改为unicode,len() 现在交付打印的标志。因此,格式化工作:


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

我正在寻找一个更通用的解决方案。。。除了我的示例之外,还有许多其他非打印字符。是的,这取决于如何和在哪里,我想。。。这只是为了进行漂亮的打印/制表,所以如果有时出现错误,你可能会涉入其中……什么是
“abc”
plen
“123\t456”
怎么样<代码>“12345\r67”<代码>“123456\n789”<代码>“123456\r78\n9abcd”?基本上,你必须决定你的角色集的规则并编写一个算法。这真是一个困难的过程。我尝试了不同的方法,包括一些
subprocess.Popen(…).communicate()
尝试,但没有效果。
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)