2013-02-15 19 views
6

Python'da bir dizenin "yazdırılan" uzunluğunu (en iyi tahminini) bulmanın bir yolu var mı? Örneğin. 'potaa \ bto', len’da 8 karakter, ancak tty’ye yazdırılan yalnızca 6 karakterden oluşur.Python'da bir dizenin basılı uzunluğu

Beklenen kullanım:

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

Boşver, ben questiom –

+1

' "abc"' arasında 'plen' nedir yanlış okumuş? "123 \ t456" 'ya ne dersiniz? ' "12345 \ R67"'? "123456 \ n789" '? "123456 \ r78 \ n9abcd" '? Esas olarak, karakter kümeniz için kurallara karar vermeniz ve bir algoritma yazmanız gerekir. –

+1

Bu gerçekten zor olanı. Bazı altprocess.Popen (...) dahil olmak üzere farklı yaklaşımları denedim. –

cevap

1

En azından ANSI TTY çıkış sırası için, bu işleri:

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) 

Baskılar:

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

b veya dikey sekme veya \ backspaces için \ n vs \ n - nasıl ve nerede yazdırıldığına bağlı, değil mi?

+0

Daha genel bir çözüm arıyorum ... benim örneğimden başka birçok yazdırılamayan karakter var. Evet, nasıl ve nerede olduğuna bağlı, sanırım ... bu sadece güzel baskı/tablolama için yani çok yanlış değil, bazen yanlış geliyorsa bazen – wim

+0

[curses] (http://docs.python.org) /2/library/curses.html) o zaman ... – dawg

1

Dizenin basılı uzunluğu dizenin türüne göre değişir.

Python 2.x'deki normal dizeler utf-8'dir. Utf-8'in uzunluğu, String'deki byte'lara eşit 'dur. Türü unicode olarak değiştirin, len() şimdi basılı işaretler sunar. Yani Biçimlendirme çalışır:

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)