2013-02-15 33 views
6

में एक स्ट्रिंग की मुद्रित लंबाई क्या पाइथन में एक स्ट्रिंग की "मुद्रित" लंबाई खोजने का कोई तरीका है (यहां तक ​​कि सबसे अच्छा अनुमान)? जैसे 'पोटाए \ बीटीओ' len में 8 वर्ण हैं लेकिन टीटी पर केवल 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 (...) शामिल हैं। संवाद() 'कोशिश करता है, लेकिन इसका कोई फायदा नहीं हुआ। –

उत्तर

1

कम से कम एएनएसआई 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 \ ख या लम्बवत टैब या के लिए \ r बनाम \ n - यह निर्भर करता है कि यह कैसे और कहाँ मुद्रित है, नहीं?

+0

मैं एक और सामान्य समाधान की तलाश में हूं ... मेरे उदाहरण की तुलना में कई अन्य गैर-प्रिंटिंग वर्ण हैं। हां यह निर्भर करता है कि कैसे और कहां, मुझे लगता है ... यह सिर्फ सुंदर मुद्रण/सारणीकरण के लिए है, इसलिए यदि यह कभी-कभी गलत हो जाता है तो यह बहुत कठोर नहीं होता है – wim

+0

आप [curses] में जा सकते हैं (http://docs.python.org /2/library/curses.html) तो ... – dawg

1

स्ट्रिंग की मुद्रित लंबाई स्ट्रिंग के प्रकार पर निर्भर करती है।

पायथन 2.x में सामान्य तार utf-8 में हैं। यूटीएफ -8 की लंबाई स्ट्रिंग में बाइट्स के बराबर है। प्रकार को यूनिकोड में बदलें, लेन() अब मुद्रित संकेत प्रदान करता है। तो स्वरूपण काम करता है:

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)