2013-02-15 11 views
6

Pythonで文字列の "印刷"長さ(最高の推測さえ)を見つける方法はありますか?例えば。 'potaa \ bto'はlenでは8文字ですが、ttyには6文字しか表示されません。Pythonでの文字列の長さの印刷

予想される使用:

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

ネヴァーマインド、私はquestiom –

+1

' "ABC"' 'のplen'は何を読み違え? '' 123 \ t456 "'についてはどうですか? '' 12345 \ r67 "'? '" 123456 \ n789 "'? '' 123456 \ r78 \ n9abcd "'?基本的には、キャラクタセットのルールを決めてアルゴリズムを書く必要があります。 –

+1

これは本当に難しいものです。私はいくつかの 'subprocess.Popen(...)。communicate()'を試みるなど、さまざまなアプローチを試みましたが、役に立たなかった。 –

答えて

1

少なくとも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 vs \ n - それはどこでどのように印刷されるのですか?

+0

私はより一般的な解決策を探しています...私の例よりも多くの他の非印刷文字があります。はい、それはどうやってどこかに依存します...これはきれいな印刷/集計のためのものです。時には間違っているとあまりにも劇的ではありません。 – wim

+0

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

1

文字列の印刷長さは、文字列の種類によって異なります。

Python 2.xの通常の文字列はutf-8です。 utf-8の長さは、Stringのバイト数に等しい です。タイプをユニコードに変更すると、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) 
関連する問題