2013-02-15 2 views
6

파이썬에서 문자열의 "인쇄 된"길이를 (심지어 가장 추측해도) 찾을 수있는 방법이 있습니까? 예 : 'potaa \ bto'는 len에서는 8 자이지만, tty에는 6 자까지만 인쇄됩니다.파이썬에서 문자열의 인쇄 된 길이

예상 사용은 :

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) 그런 다음 ... – dawg

1

문자열의 인쇄 된 길이는 문자열의 유형에 따라 다릅니다.

파이썬 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) 
관련 문제